可以将cuda +推力项目拆分为多个文件

时间:2011-11-03 06:34:31

标签: cuda thrust

使用Thrust(cuda api)和openMP技术的im建筑和项目。我的程序的主要目的是提供一个计算内容的界面,同时说话。 为了做到这一点,我决定使用STRATEGY设计模式,这基本上意味着我们需要使用虚函数定义基类,然后从该基类派生其他类并实现所需的函数。

我的问题从这里开始: 1。我的项目可以有超过1个.CU文件吗? 2。 CU文件可以删除类吗?

  class foo 
        {
            int m_name;
            void doSomething();
        }

3。这个继续2.我认为DEVICE内核不能在类中声明,必须这样做:

//header file
__DEVICE__ void kernel(int x, inty)
{.....
}

class a : foo
{
   void doSomething();
}

//cu file

void a::doSomething()
{
  kernel<<<1,1>>>......();
}

这是正确的方法吗? 4.last问题是,我们使用THRUST,我也必须使用CU文件吗?

谢谢,igal

1 个答案:

答案 0 :(得分:2)

  1. 是的,您可以在项目中使用多个.cu文件。
  2. 是的,但有限制。根据* CUDA_C_Programming_Guide * v.4.0,第3.1.5节:
      

    编译器的前端根据C ++语法规则处理CUDA源文件。主机代码支持完整的C ++。但是,如附录D中所述,设备代码仅完全支持C ++的一个子集。由于使用了C ++语法规则,因此无法将void指针(例如,由malloc()返回)分配给非void指针。没有类型转换。

  3.   
  4. 你几乎是正确的。在声明内核时,您必须使用__global__关键字。

    __global__ void kernel(int x, inty)
    {.....
    }
    
  5. 嗯,是的。实际上你的推力提升设备代码应该用nvcc编译。有关详细信息,请参阅thrust文档。
  6. 通常,您将编译您的程序:

        $ nvcc -c device.cu
        $ g++  -c host.cpp   -I/usr/local/cuda/include/
        $ nvcc device.o host.o
    

    或者,您可以使用g ++执行最终链接步骤。

        $ g++ tester device.o host.o -L/usr/local/cuda/lib64 -lcudart
    

    在Windows上更改-I-L之后的路径。另外,据我所知,你必须使用cl编译器(MS Visual Studio)。

    注1: 注意x86 / x64兼容性:如果使用64位CUDA Toolkit,也可以使用64位编译器。 (还要检查-m32的{​​{1}}和-m64选项)

    注2: nvcc包含内核和调用内核的函数。此函数必须使用device.cu进行注释。 它可以包含类(限制适用)。 extern "C"包含host.cpp(非内核)中函数的extern "C" 声明的纯C ++代码。