2013-09-30 50 views
1

我有一个项目有很多源文件(例如:main.cu,a.cu,b.cu,c.cu,d.cu)。每个函数和内核调用(全球设备)。如何在Nsight Eclipse中包含几个源文件?

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

  1. 如果我调用内核函数从main.cu,在a.cu声明。如何在a.cu宣布我的#include的内核函数在main.cu使用,无需做推荐的#include “a.cu”

  2. 难道我在a.cu创建一个标题A.H与内核函数的向前声明?示例: extern void functionA(type);

那么CUDA内核函数呢?我应该为从其他源文件使用的每个源文件创建一个头文件吗?

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

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

回答

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. 右键单击项目,去亲perties。
    2. 构建/设置。
    3. 针对SM 2.0或更新版本的安装构建。
    4. 选择“分离编译”收音机。

    设备。铜:

    __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); 
    
  3. 隔离CUDA代码一个常见的模式是具有在具有主机功能包裹内核调用.CU文件隔离CUDA代码。通过这种方式,您可以将从.cu文件生成的目标文件链接到以.cpp或.c文件编写的主机代码。请记住,导出的主机代码功能应通过extern "C"限定为可从.c文件使用。

extern声明可以放在.h文件中。请注意,使用CUDA C语法的.h文件(__global__是CUDA C专用的)不能包含在.cpp或.c中。

将文件添加到项目

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

从构建

如果你确实需要,可以装置代码复制到头部和包括头部(惯例是有这样的头文件.cuh扩展排除文件,虽然.H工作只是一样)。你可以包括.cu - 问题是Nsight认为这些文件是一个源文件并且试图编译它们。您可以通过在构建属性中的构建子树中的任何属性页的顶部选中“从构建中排除资源”复选框来从构建中排除.cu文件。

CUDA多文件样本

几乎任何不平凡的样品被分解成多个文件。只需从例如“粒子”样本创建一个Nsight项目。

+0

我不明白一些部​​分。为什么你有device.cu两个bitreverse内核函数?我认为一个是你的全局内核功能,另一个是设备。他们可以有相同的名字吗? – mrei

+0

我只有SM 1.3只有 – mrei

+0

哦,对:)有两个函数具有相同的名称 - 我只是让它们显示内核('__global__')和设备('__device__')函数可以不同文件。请注意,'bitreverse'函数名称被重载了不同的参数列表。您不能单独由CUDA声明说明符覆盖(例如,您不能使用具有相同名称和参数列表的'__global__'和'__device__'函数)。 – Eugene

相关问题