CUDA多个文件 在CUDA+C++中有什么方法可以做到这一点??
班级:1CUDA多个文件 在CUDA+C++中有什么方法可以做到这一点??,cuda,Cuda,班级: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 cl
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();
}
可以,但设备代码(即标有设备或全局的功能)必须在需要的同一编译单元中可见,即无链接
因此,只要标题中有Class1
和Class2
的定义,而不仅仅是声明,那么它就应该工作。是的,但是设备代码(即标有设备或全局的函数)必须在需要它的同一编译单元中可见,即没有链接
因此,只要在标题中有
Class1
和Class2
的定义,而不仅仅是声明,那么它就应该工作。不,您的代码不会工作,因为ExecuteCuda1
和ExecuteCuda2
是\uuuuuuuuuuuuuu主机
函数,这意味着它们将在CPU上执行。\uuuu host\uuuu
函数调用任何标记为\uuuu device\uuuu
的函数是非法的,即使它们是公共类的成员函数
这样构造代码将有效:
__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();
}
};
\uuuuu全局\uuuuuu内核1(){…}
一班
{
void ExecuteCuda1()
{
//启动内核1
内核1();
}
};
__全局内核2(){…}
二级
{
void ExecuteCuda2()
{
//启动内核2
内核2();
}
};
三班
{
void ExecuteCuda3()
{
Class1 cl1=新的Class1();
cl1->ExecuteCuda1();
Class2 cl2=新的Class2();
cl2->ExecuteCuda2();
}
};
请注意,
\uuuuuu全局
函数不能是成员函数,即使它们声明为静态
。这就是为什么我们必须在任何类之外定义内核。正如Dan所说,由于缺少CUDA链接器,代码必须在单个翻译单元中定义。您可以通过使用头文件在多个文件中实现这一点。不,您的代码不起作用,因为ExecuteCuda1
和ExecuteCuda2
是\uuuuuuuuu主机
函数,这意味着它们将在CPU上执行。\uuuu host\uuuu
函数调用任何标记为\uuuu device\uuuu
的函数是非法的,即使它们是公共类的成员函数
这样构造代码将有效:
__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();
}
};
\uuuuu全局\uuuuuu内核1(){…}
一班
{
void ExecuteCuda1()
{
//启动内核1
内核1();
}
};
__全局内核2(){…}
二级
{
void ExecuteCuda2()
{
//启动内核2
内核2();
}
};
三班
{
void ExecuteCuda3()
{
Class1 cl1=新的Class1();
cl1->ExecuteCuda1();
Class2 cl2=新的Class2();
cl2->ExecuteCuda2();
}
};
请注意,
\uuuuuu全局
函数不能是成员函数,即使它们声明为静态
。这就是为什么我们必须在任何类之外定义内核。正如Dan所说,由于缺少CUDA链接器,代码必须在单个翻译单元中定义。您可以通过使用头文件在多个文件中实现这一点。是的,我们现在有一个链接器。他们称之为“可重定位设备代码”。是的,我们现在有一个链接器。他们称该选项为“可重定位设备代码”。