0

我正在构建和项目,它同时使用 Thrust(cuda api)和 openMP 技术。我的程序的主要目的是提供一个接口来计算某些东西,同时说。为了做到这一点,我决定使用 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.最后一个问题是,我们使用THRUST,我也必须使用CU文件吗?

谢谢,伊格尔

4

1 回答 1

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

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

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

    __global__ void kernel(int x, inty)
    {.....
    }
    
  4. 嗯,是。实际上,您的推力增强设备代码应该使用nvcc. 有关详细信息,请参阅thrust文档。

一般来说,你会像这样编译你的程序:

    $ 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-m64选项nvcc也)

注 2: device.cu包含内核和调用内核的函数。这个函数必须用 注释extern "C"。它可以包含类(有限制)。 host.cpp包含纯 C++ 代码,其中extern "C" 声明device.cu了(非内核)中的函数。

于 2011-11-04T17:01:38.087 回答