我有一个包含许多源文件的项目(示例:main.cu、a.cu、b.cu、c.cu、d.cu)。每个都有函数和内核调用(全局 和设备)。
在头文件 (cpu.h) 中,主机端使用的所有结构和定义。 另一个头文件(gpu.h)在设备端使用的所有结构和定义。
如果我从 main.cu 调用内核函数,在 a.cu 中声明。我如何#include那些在 a.cu 中声明的内核函数以在 main.cu 中使用,而不执行 not 推荐 #include "a.cu"?
我是否在 a.cu 中创建带有内核函数前向声明的 header a.h?例子: extern void functionA(type);
CUDA 内核函数怎么样?我应该为从另一个源文件使用的每个源文件创建一个头文件吗?
- 在哪里可以找到一些包含多个源文件的简单 CUDA 示例?
我提到 Nsight Eclipse 是因为我在使用它和多个来源时遇到了很多麻烦。 我在 Ubuntu Linux 和 Mac OS 环境中使用 CUDA 5.5 工具包。 我的主要开发环境是在 Ubuntu Linux 机器上有 4 个 Tesla C1060 卡。
最佳答案
分离内核。在一个工程中,创建两个文件(我重构了默认的Runtime Project模板,创建了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 代码 一种常见的模式是将 CUDA 代码隔离在 .cu 文件中,这些文件具有包装内核调用的主机函数。通过这种方式,您可以将此类 .cu 文件生成的目标文件链接到以 .cpp 或 .c 文件编写的主机代码。请记住,导出的主机代码函数应使用
extern "C"
进行限定才能从 .c 文件中使用。
extern
声明可以放在 .h 文件中。请注意,具有 CUDA C 语法的 .h 文件(__global__
是 CUDA C 特定的)不能包含在 .cpp 或 .c 中。
将文件添加到项目
通常我只是将文件复制到项目文件夹,右键单击项目并执行“刷新”。 Nsight 会将它们编入索引并包含在构建中。
从构建中排除文件
如果绝对需要,您可以将设备代码复制到 header 并包含 header (约定是此类 header 文件的扩展名为 .cuh,尽管 .h 的工作原理相同)。您可以包含 .cu - 问题是 Nsight 将此类文件视为源文件并尝试编译它们。您可以通过选中构建属性中构建子树中任何属性页顶部的“从构建中排除资源”复选框来从构建中排除 .cu 文件。
CUDA 多文件示例
几乎所有重要样本都被分解成多个文件。只需从“粒子”示例等创建一个 Nsight 项目。
关于linux - 如何在 Nsight Eclipse 中包含多个源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19101763/