当我在同一文件 mainFunc.cu 中使用 kernelAdd() 函数和 main() 函数构建代码时,一切正常。
但是当我将 kernelAdd.cu 文件中的 kernelAdd() 函数与 main.cpp 文件中的主文件分开时,它会出现两个错误:
“错误 C2065:‘添加’:未声明的标识符”
和“错误 C2059:语法错误:'
我在 Visual Studio 2008 和 Cuda v5.0 中构建了它们。
我该如何纠正它的错误?
Thanks!
内核添加文件
__global__ void add(int a, int b, int *c) {
*c = a + b;
}
主函数.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;
}
错误 C2065:“添加”:未声明的标识符
这个错误与CUDA无关。这add
函数属于一个编译单元(kernelAdd.cu
),而另一个编译单元(mainFunc.cpp
)对此一无所知。为了给它这些信息,您必须创建一个额外的头文件kernelAdd.h
与函数声明:
__global__ void add(int a, int b, int *c);
并将其包含在mainFunc.cpp
:
#include "kernelAdd.h"
Every cu
or cpp
文件是单独编译的,只知道它在其包含的头文件中看到的函数。
错误 C2059:语法错误:“
现在我在这里猜测(没有VS,甚至没有Windows来检查),但VS似乎根据其扩展名为项目中的每个文件选择编译器。因此mainFunc.cpp
使用常见的 C++ 编译器进行编译,但是<<<>>>
内核调用的语法不属于标准 C++ — 它来自 CUDA。所有 CUDA 特定语法必须仅在将使用以下命令编译的文件中使用nvcc
.
所以解决你的问题的一种方法是重命名mainFunc.cpp
to mainFunc.cu
。您仍然可以保留您的主文件.cpp
,当然,但是你必须将内核调用移动到某个普通的 C++ 函数中cu
文件并将其公开在标准 C++ 头文件中,您可以使用该头文件.cpp
文件将包括。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)