0

如果这不是微不足道的,请原谅我。cusp::csr_matrix<int,float,cusp::device_memory>我有一个小班,像这样环绕:

class CuspMatrix 
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
 ...
}

到目前为止,我没有做任何我认为需要为设备编译的事情。但是我确实计划在这个特定的类中编写代码,作为一个成员/函数,应该在设备上执行,但是如果我理解正确,cusp已经为我提供了这个功能?例如:

ValueType v_nrm2 = cusp::blas::nrm2(V);
cusp::transpose(M,M_t);

理想情况下,计算范数或转置应该为设备执行而编译。如果这是类方法的一部分,在这种情况下我该怎么办?

我是否制作*.hpp类的整个头文件 a*.cu并添加它以进行nvcc编译?我是否仅在 a 中标记实际代码(而不是标头声明)*.cu并将其添加以进行nvcc编译?或者这些都没有必要?

4

1 回答 1

2

你必须记住的是,cusp 是一个建立在thrust 之上的模板库,它也是一个模板库。cusp 和thrust 类方法都包含很多设备代码,所以如果你从它们继承,你也继承了很多设备代码。

这意味着无论您选择如何构建代码,在“经典”CUDA 编译中,您的类的实例化点以及所有包含的 cusp 和推力模板代码都必须在同一个翻译单元中,并且必须以一种形式呈现给 nvcc它将识别为需要设备代码编译(即在 .cu 文件中或使用适当的编译器开关)。

所以这个定义派生类并实例化它的序列:

class CuspMatrix 
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
    ...
}

...

{
    CuspMatrix A;
    ...
}

必须用 nvcc 编译。

于 2013-07-05T07:16:05.377 回答