如何设置我的代码/ VS10以识别.c文件中的CUDA函数调用?

时间:2012-06-04 18:16:14

标签: c visual-studio-2010 build compiler-errors cuda

基本上,我有编译器编译我的.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。如果您尝试返回任何其他内容,就像我一样,您将收到编译器错误。

1 个答案:

答案 0 :(得分:3)

  1. 将调用CUDA内核的函数放在 .cu 文件中。

  2. 设置VS2010以使用CUDA编译器编译CU文件,而不是内置的(使用位于CUDA SDK中的CUDA规则文件(Cuda.props,Cuda.xml,Cuda.targets))。 / p>

  3. 我建议将内核放在具有不同扩展名的文件中(例如 .curnel 文件),这样就不会直接编译它们(仅在调用时)。

  4. 我建议将调用CUDA内核的函数声明放在 .cuh 文件中。