如何将内核文件CUDA与主.cpp文件分开

时间:2013-08-13 04:54:08

标签: visual-studio-2008 cuda

当我在同一个文件mainFunc.cu中使用kernelAdd()函数和main()函数构建代码时,没关系。

但是当我将kernelAdd.cu文件中的kernelAdd()函数与main.cpp文件中的主文件分开时,它构建了2个错误:

“错误C2065:'添加':未声明的标识符”

和“错误C2059:语法错误:'<'”

我在Visual Studio 2008和Cuda v5.0中构建它们。

我如何纠正错误?

谢谢!

kernelAdd.cu

__global__ void add(int a, int b, int *c) {
*c = a + b;
}

mainFunc.cpp

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <conio.h>

int main(void) {

int c;
int *devC;

cudaMalloc((void**) &devC, sizeof(int));
add<<<1,1>>>(2,7,devC);
cudaMemcpy(&c, devC, sizeof(int), cudaMemcpyDeviceToHost);

printf("2+7=%d\n", c);

cudaFree(devC);

getch();
return 0;
}

2 个答案:

答案 0 :(得分:5)

  

错误C2065:'add':未声明的标识符

此错误与CUDA无关。 add函数属于一个编译单元(kernelAdd.cu),而另一个编译单元(mainFunc.cpp)对它一无所知。为了给它提供这些信息,你必须使用函数声明创建一个额外的头文件kernelAdd.h

__global__ void add(int a, int b, int *c);

并将其包含在mainFunc.cpp

#include "kernelAdd.h"

每个cucpp文件都是单独编译的,只知道它在包含的头文件中看到的函数。

  

错误C2059:语法错误:'&lt;'

现在我在这里猜测(没有VS,甚至没有Windows检查),但似乎VS根据其扩展名为项目中的每个文件选择编译器。因此mainFunc.cpp使用通用的C ++编译器进行编译,但内核调用的<<<>>>语法不属于标准C ++ - 它来自CUDA。所有特定于CUDA的语法只能用于那些将使用nvcc编译的文件。

解决问题的一种方法是将mainFunc.cpp重命名为mainFunc.cu。当然,您仍然可以保留主文件.cpp,但是您必须将内核调用移动到cu文件中的一些普通C ++函数,并将其公开在标准C ++头文件中,您的.cpp文件将包含。

答案 1 :(得分:2)

C制作CUDA C的唯一补充是启动内核(<<<>>>)的三角括号语法。其他一切都使用现有的C功能。将函数指定为__global__将导致nvcc为设备编译它并创建符号等,以便可以从主机调用它。

这意味着:

  1. 设备代码(__global__功能等)必须位于.cu文件中。
  2. 使用<<<>>>语法启动内核的主机代码必须位于.cu文件中。
  3. 你仍然可以在.cpp文件中拥有所有其他主机代码,只需要在.cu文件中放置一个存根来调用内核,例如: void launch_add(...) { add<<<...>>>(...); }