基本上,我有编译器编译我的.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有一个错误:“错误C2059:语法错误:'string'”在“extern ...”行上。 (这可能是因为我从c ++示例中获取了它吗?)
main.c有一个错误:“错误C2065:'内核':未声明的标识符”
和:“错误C2059:语法错误:'&lt;'”
但是当我注释掉内核调用时,所以它只是cudaMalloc,我得到:“错误LNK2019:函数_main中引用的未解析的外部符号_cudaMalloc @ 8”
和:“致命错误LNK1120:1未解析的外部”
它是Visual Studio 2010的东西,还是我不包括的东西?从SDK示例中,我无法分辨出我做错了什么,然后他们找到了一种方法,我想,不使用三重括号(CTRL + F找不到任何)。任何帮助表示赞赏。提前谢谢!
编辑:在看了一些更多的例子后,他们确实使用了三重括号语法。
编辑:对于那些使用此作为参考的人,__global__
函数只能返回void。如果您尝试返回任何其他内容,就像我一样,您将收到编译器错误。
答案 0 :(得分:3)
将调用CUDA内核的函数放在 .cu 文件中。
设置VS2010以使用CUDA编译器编译CU文件,而不是内置的(使用位于CUDA SDK中的CUDA规则文件(Cuda.props,Cuda.xml,Cuda.targets))。 / p>
我建议将内核放在具有不同扩展名的文件中(例如 .curnel 文件),这样就不会直接编译它们(仅在调用时)。
我建议将调用CUDA内核的函数声明放在 .cuh 文件中。