基本上,我让编译器编译我的 .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 有一个错误:“error C2059: syntax error : 'string'” 在“extern...”行。 (这可能是因为我从 C++ 示例中获取了它吗?)
main.c 出现错误:“error C2065: 'kernel': undeclared identifier”
和:“错误 C2059:语法错误:'<'”
但是当我注释掉内核调用时,它只是 cudaMalloc,我得到:“error LNK2019: unresolved external symbol _cudaMalloc@8 referenced in function _main”
和:“ fatal error LNK1120:1 个 Unresolved external 因素”
它是 Visual Studio 2010 的东西,还是我没有包括的东西?从 SDK 示例中,我无法判断我做错了什么,除此之外,我认为他们找到了一种不使用三重括号的方法(CTRL+F 没有找到)。任何帮助表示赞赏。提前致谢!
编辑:在查看了更多示例之后,他们确实很好地使用了三重括号语法。
编辑:对于那些以此为引用的人,__global__
函数只能返回 void。如果您像我一样尝试返回任何其他内容,您将收到编译器错误。
最佳答案
将调用CUDA内核的函数放在.cu文件中。
设置 VS2010 以使用 CUDA 编译器编译 CU 文件,而不是内置编译器(使用位于 CUDA SDK 中的 CUDA 规则文件(Cuda.props、Cuda.xml、Cuda.targets))。
我建议将内核放在具有不同扩展名的文件中(例如 .curnel 文件),这样它们就不会被直接编译(仅在调用时)。
<我建议将调用 CUDA 内核的函数的声明放在 .cuh 文件中。
关于c - 如何设置我的代码/VS10 以识别 .c 文件中的 CUDA 函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10886104/