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)
错误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)
每个文件cu
或cpp
文件都是单独编译的,只知道它在包含的头文件中看到的函数.
错误C2059:语法错误:'<'
现在我猜这里(没有VS,甚至没有Windows检查),但似乎VS根据其扩展为项目中的每个文件选择编译器.因此mainFunc.cpp
使用通用的C++编译器进行编译,但<<<>>>
内核调用的语法不属于标准C++ - 它来自CUDA.所有特定于CUDA的语法必须仅用于那些将要编译的文件nvcc
.
因此,解决问题的一种方法是重命名mainFunc.cpp
为mainFunc.cu
..cpp
当然,你仍然可以保留你的主文件,但是你必须将内核调用移动到文件中的一些普通C++函数cu
,并将其暴露在标准C++头文件中,.cpp
文件将包含该文件.
使 CUDA C 成为 C 语言的唯一补充是用于启动内核的三重尖括号语法 ( <<<>>>
)。其他一切都使用现有的 C 功能。指定一个函数 as__global__
将导致 nvcc 为设备编译它并创建符号等,以便可以从主机调用它。
这意味着:
__global__
函数等)必须位于 .cu 文件中。<<<>>>
语法启动内核的主机代码必须位于 .cu 文件中。您仍然可以将所有其他主机代码放在 .cpp 文件中,只需在 .cu 文件中放置一个存根即可调用内核,例如void launch_add(...) { add<<<...>>>(...); }
.
归档时间: |
|
查看次数: |
2087 次 |
最近记录: |