基本上,我让编译器编译我的 .cu 文件,并且(我认为)在这些 .cu 文件中有完整的操作,但是当我尝试调用它们(kernel<<<1,1>>>(void)
)时,编译器会由于 CUDA 语法而注册语法错误。此外,像 cudaMalloc 这样的调用在 c 文件中也会失败。
这里有三个非常短的文件,所以我可以告诉你哪里出错了。
//kernel.cu
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
__global__ int kernel(void){
return 5;
}
和
//kernel.h
#ifndef _KERNEL_h_
#define _KERNEL_h_
extern "C" int kernel(void);
#endif
和
//main.c
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
int main() {
int* device_a;
cudaMalloc( (void**)&device_a, sizeof(int) );
kernel<<<1,1>>>();
}
我从一些 SDK 示例中获得了头文件。另外,我使用 CUDA 4.2 设置了我的构建配置,因此为什么 .cu 文件可以编译。如果我犯了任何偶然的语法错误,那是因为我为了发布而简化了它,而不是它实际上在源代码中,尽管请提及它以防万一。
kernel.cu 编译良好。
kernel.h 在“extern...”行有一个错误:“error C2059: syntax error: 'string'”。(这可能是因为我是从一个 c++ 示例中获取的吗?)
main.c 有一个错误:“错误 C2065:‘内核’:未声明的标识符”
和:“错误 C2059:语法错误:'<'”
但是当我注释掉内核调用时,它只是 cudaMalloc,我得到:“错误 LNK2019:未解析的外部符号 _cudaMalloc@8 在函数 _main 中引用”
和:“致命错误 LNK1120:1 个未解决的外部问题”
是 Visual Studio 2010 的东西,还是我不包括的东西?从 SDK 示例中,我无法判断我做错了什么,除此之外,我认为他们找到了一种不使用三方括号的方法(CTRL+F 没有找到任何方法)。任何帮助表示赞赏。先感谢您!
编辑:在查看了更多示例之后,他们确实使用三括号语法就好了。
编辑:对于那些使用 this 作为参考,__global__
函数只能返回 void。如果您像我一样尝试返回任何其他内容,您将收到编译器错误。