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

Hon*_*gTu 4 cuda visual-studio-2008

当我在同一个文件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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

fja*_*rri 5

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

此错误与CUDA无关.该add函数属于一个编译单元(kernelAdd.cu),而另一个编译单元(mainFunc.cpp)不知道它的任何内容.为了给它这个信息,你必须kernelAdd.h使用函数声明创建一个额外的头文件:

__global__ void add(int a, int b, int *c);
Run Code Online (Sandbox Code Playgroud)

并将其包括在mainFunc.cpp:

#include "kernelAdd.h"
Run Code Online (Sandbox Code Playgroud)

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

错误C2059:语法错误:'<'

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

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


Tom*_*Tom 4

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

这意味着:

  1. 设备代码(__global__函数等)必须位于 .cu 文件中。
  2. 使用该<<<>>>语法启动内核的主机代码必须位于 .cu 文件中。

您仍然可以将所有其他主机代码放在 .cpp 文件中,只需在 .cu 文件中放置一个存根即可调用内核,例如void launch_add(...) { add<<<...>>>(...); }.