CUDA多个文件

时间:2011-08-10 15:37:06

标签: cuda

在CUDA + C ++中有没有办法做到这一点?

课程:1

class1
{
   __device__ ....//some cuda code

    void ExecuteCuda1(); //this should execute the cuda code in this class
}

课程:2

 class2
{
   __device__ ....//some cuda code

    void ExecuteCuda2(); //this should execute the cuda code in this class
}

课程:3

class3
{
   cl1 = new class1();
   cl1->ExecuteCuda1();

   cl1 = new class2();
   cl1->ExecuteCuda2();
}

2 个答案:

答案 0 :(得分:3)

不,您的代码无效,因为ExecuteCuda1ExecuteCuda2__host__函数,这意味着它们将在CPU上执行。 __host__函数调用标记为__device__的任何函数是非法的,即使它们是公共类的成员函数。

像这样构建代码将起作用:

__global__ kernel1() {...}

class Class1
{
  void ExecuteCuda1()
  {
    // launch kernel1
    kernel1<<<...>>>();
  }
};

__global__ kernel2() {...}

class Class2
{
  void ExecuteCuda2()
  {
    // launch kernel2
    kernel2<<<...>>>();
  }
};

class Class3
{
  void ExecuteCuda3()
  {
    Class1 cl1 = new class1();
    cl1->ExecuteCuda1();

    Class2 cl2 = new class2();
    cl2->ExecuteCuda2();
  }
};

请注意,__global__函数不能是成员函数,即使它们被声明为static。这就是我们必须在任何类之外定义内核的原因。正如Dan所说,由于缺少CUDA链接器,代码必须在单个翻译单元中定义。您可以使用头文件在多个文件中实现此目的。

答案 1 :(得分:2)

是的,但设备代码(即标有设备全局的功能)必须在需要它的同一编译单元中可见,即无链接。

因此,只要您在标题中定义Class1Class2而不仅仅是声明,那么它应该可以正常工作。