如何在Nsight Eclipse中包含多个源文件?

时间:2013-09-30 19:00:51

标签: linux eclipse cuda include nsight

我有一个包含许多源文件的项目(例如:main.cu,a.cu,b.cu,c.cu,d.cu)。每个都有函数和内核调用(全局设备)。

在头文件(cpu.h)中,主机端使用的所有结构和定义。 另一个头(gpu.h)在设备端使用的所有结构和定义。

  1. 如果我从 main.cu 调用内核函数,在 a.cu 中声明。如何 #include a.cu 中声明的内核函数在 main.cu 中使用,而不执行推荐 #include“a.cu”

  2. 我是否在 a.cu 中使用内核函数的前向声明创建标题 a.h ?例: extern void functionA(type);

  3. CUDA内核函数怎么样?我应该为从另一个源文件使用的每个源文件创建一个头文件吗?

    • 我在哪里可以找到一些包含多个源文件的简单CUDA示例?

    我提到了Nsight Eclipse,因为我遇到了很多麻烦和多个来源。 我在Ubuntu Linux和Mac OS环境中使用CUDA 5.5 Toolkits。 我的主要开发环境是在Ubuntu Linux机器上使用4张Tesla C1060卡。

1 个答案:

答案 0 :(得分:3)

  1. 分离内核。在项目中,创建两个文件(我重构了默认的运行时项目模板并创建了device.cu和host.cu)

    device.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]);
    }
    

    host.cu:

    extern __global__ void bitreverse(void *data);
    
    ...
    
    bitreverse<<<1, WORK_SIZE, WORK_SIZE * sizeof(int)>>>(d);
    
  2. 单独编译

    1. 右键单击项目,转到属性。
    2. 构建/设置。
    3. 为SM 2.0或更新版本设置构建。
    4. 选择“单独编辑”电台。
    5. device.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;
      }
      

      host.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);
      
    6. 隔离CUDA代码一种常见的模式是将.CUDA代码隔离在.cu文件中,这些文件具有包含内核调用的主机功能。这样,您可以将从此类.cu文件生成的目标文件链接到以.cpp或.c文件编写的主机代码。请记住,导出的主机代码功能应该使用extern "C"进行限定,以便可以从.c文件中使用。

    7. extern声明可以放在.h文件中。请注意,带有CUDA C语法的{。h文件(__global__是特定于CUDA C的)不能包含在.cpp或.c中。

      向项目添加文件

      通常我只是将文件复制到项目文件夹,右键单击该项目并执行“刷新”。 Nsight将索引它们并包含在构建中。

      从构建中排除文件

      如果你绝对需要,你可以将设备代码复制到标题并包含标题(惯例是对这样的头文件使用.cuh扩展名,但.h的工作方式相同)。你可以包括.cu - 问题是Nsight认为这些文件是源文件并试图编译它们。您可以通过选中构建属性中构建子树中任何属性页顶部的“从构建中排除资源”复选框,从构建中排除.cu文件。

      CUDA多文件样本

      几乎所有非平凡的样本都被分解为多个文件。只需从例如“粒子”样本创建一个Nsight项目。