在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();
}
答案 0 :(得分:3)
不,您的代码无效,因为ExecuteCuda1
和ExecuteCuda2
是__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)
是的,但设备代码(即标有设备或全局的功能)必须在需要它的同一编译单元中可见,即无链接。
因此,只要您在标题中定义Class1
和Class2
而不仅仅是声明,那么它应该可以正常工作。