我有一个包含许多源文件的项目(例如:main.cu、a.cu、b.cu、c.cu、d.cu)。每个都有函数和内核调用(全局和设备)。
在一个头(cpu.h)中,主机端使用的所有结构和定义。
另一个头(gpu.h)设备端使用的所有结构和定义。
如果我从main.cu调用内核函数,在a.cu中声明。如何将a.cu中声明的内核函数包含到main.cu中,而不执行不推荐的包含“a.cu”的操作?
我是否在a.cu中创建带有内核函数前向声明的头a.h?例子:
外部无效功能(类型);
cuda内核函数呢?我应该为从另一个源文件使用的每个源文件创建一个头文件吗?
我在哪里可以找到一些简单的cuda示例和多个源文件?
我提到nsight eclipse是因为我在使用它和多个源时遇到了很多问题。
我在ubuntu linux和mac os环境中使用cuda 5.5工具包。
我的主要开发环境是在ubuntu linux机器上使用4个tesla c1060卡。
最佳答案
分离果仁。在一个项目中,创建两个文件(我重构了默认的运行时项目模板并创建了device.cu和host.cu)
设备.cu:
__device__ unsigned int bitreverse(unsigned int number) {
number = ((0xf0f0f0f0 & number) >> 4) | ((0x0f0f0f0f & number) << 4);
number = ((0xcccccccc & number) >> 2) | ((0x33333333 & number) << 2);
number = ((0xaaaaaaaa & number) >> 1) | ((0x55555555 & number) << 1);
return number;
}
__global__ void bitreverse(void *data) {
unsigned int *idata = (unsigned int*) data;
idata[threadIdx.x] = bitreverse(idata[threadIdx.x]);
}
主机.cu:
extern __global__ void bitreverse(void *data);
...
bitreverse<<<1, WORK_SIZE, WORK_SIZE * sizeof(int)>>>(d);
单独汇编
在“项目”上单击鼠标右键,转到“属性”。
生成/设置。
为SM 2.0或更新版本安装内部版本。
选择“单独编译”收音机。
设备.cu:
__device__ unsigned int bitreverse(unsigned int number) {
number = ((0xf0f0f0f0 & number) >> 4) | ((0x0f0f0f0f & number) << 4);
number = ((0xcccccccc & number) >> 2) | ((0x33333333 & number) << 2);
number = ((0xaaaaaaaa & number) >> 1) | ((0x55555555 & number) << 1);
return number;
}
主机.cu:
extern __device__ unsigned int bitreverse(unsigned int number);
__global__ void bitreverse(void *data) {
unsigned int *idata = (unsigned int*) data;
idata[threadIdx.x] = bitreverse(idata[threadIdx.x]);
}
...
bitreverse<<<1, WORK_SIZE, WORK_SIZE * sizeof(int)>>>(d);
隔离CUDA代码一种常见的模式是在.cu文件中隔离CUDA代码,这些文件具有包装内核调用的宿主函数。通过这种方式,您可以将从此类.cu文件生成的对象文件链接到用.cpp或.c文件编写的宿主代码。请记住,导出的主机代码函数应该限定为
extern "C"
才能从.c文件中使用。extern
声明可以放在.h文件中。请注意,具有cuda c语法(__global__
是cuda c特有的)的.h文件不能包含在.cpp或.c中。向项目添加文件
通常我只是将文件复制到项目文件夹,右键单击项目并执行“刷新”。nsight将索引它们并包含在构建中。
从生成中排除文件
如果确实需要,可以将设备代码复制到头文件中并包含头文件(惯例是对此类头文件使用.cuh扩展名,尽管.h的工作原理相同)。您可以包含.cu-问题是nsight将这些文件视为源文件并尝试编译它们。通过选中生成属性中生成子树的任何属性页顶部的“从生成中排除资源”复选框,可以从生成中排除.cu文件。
CUDA多文件示例
几乎所有不重要的样本都被分解成多个文件。只需从“粒子”示例创建nsight项目。