请原谅我,如果这是非平凡的话。
我有一个小班,围着cusp::csr_matrix<int,float,cusp::device_memory>
这样包围:
class CuspMatrix
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
...
}
到目前为止,我没有做任何我想象的需要为设备编译的事情。
但是我计划在这个特定的类中编写代码,作为成员/函数,应该在设备上执行,但如果我理解正确,cusp
已经为我提供了这个功能?
E.g:
ValueType v_nrm2 = cusp::blas::nrm2(V);
cusp::transpose(M,M_t);
计算规范或转置应理想地编译为设备执行。 在这种情况下,如果这是类方法的一部分,我该怎么办?
我是否要创建该类的整个*.hpp
头文件*.cu
并将其添加到nvcc
编译中?我是否仅在*.cu
中标记实际代码(而不是标头声明)并将其添加到nvcc
编译中?
或者这不是必要的吗?
答案 0 :(得分:2)
你必须记住的是,尖点是一个建立在推力之上的模板库,它也是一个模板库。尖点和推力类方法都包含很多设备代码,因此如果从它们继承,您也会继承许多设备代码。
这意味着无论您选择构建代码,还是在&#34; classic&#34; CUDA编译,类的实例化以及所有包含的尖点和推力模板代码必须在同一个翻译单元中,并且必须以一种它将识别为需要设备代码编译的形式呈现给nvcc(即.cu中文件或适当的编译器开关)。
所以这个定义派生类并实例化它的序列:
class CuspMatrix
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
...
}
...
{
CuspMatrix A;
...
}
必须使用nvcc编译。