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クラスのヘッダー ファイル全体を作成し、コンパイル*.cu用に追加する必要がありますか? nvcc実際のコードのみを (ヘッダー宣言ではなく) マークして、コンパイル*.cu用に追加しますか? nvccまたは、これは必要ありませんか?

4

1 に答える 1

2

心に留めておかなければならないことは、cusp はテンプレート ライブラリでもある Thrust の上に構築されたテンプレート ライブラリであるということです。カスプとスラストのクラス メソッドは両方とも多くのデバイス コードを含んでいるため、それらを継承するとデバイス コードも多く継承されます。

これは、どのようにコードを構造化することを選択しても、「クラシック」CUDA コンパイルでは、クラスのインスタンス化のポイントと、含まれるすべてのカスプおよびスラスト テンプレート コードが同じ翻訳単位にある必要があり、フォームで nvcc に提示される必要があることを意味します。デバイス コードのコンパイルが必要であると認識されます (つまり、.cu ファイル内または適切なコンパイラ スイッチを使用)。

したがって、派生クラスを定義してインスタンス化するこのシーケンスは次のとおりです。

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

...

{
    CuspMatrix A;
    ...
}

nvcc でコンパイルする必要があります。

于 2013-07-05T07:16:05.377 に答える