私はシミュレーションを書き始め、よりオブジェクト指向のアプローチを試してみることにしました。そのため、シミュレーションの空間次元を示す CUDA カーネルのテンプレート パラメーターを使用することも決定しました。問題は、ヘッダー ファイルにテンプレート関数を実装する際の制限により、.cpp ソース ファイルからカーネル ラッパーを呼び出せるようにするために、複雑なアプローチを使用しなければならなかったことです。
私のアプローチは、2 次元と 3 次元のラッパー関数をオーバーロードすることでした。次に、カーネル リソースの初期化と管理を処理するラッパー クラスのクラスを作成します。残念ながら、前述の制限により、テンプレート クラス用に 2 つのメンバーを保持する必要があります。つまり、
struct kernelWrapper{
KernelWrapper(Simulation<2> *simulation):
d_(2),
simulation2d_(simulation)
{}
KernelWrapper(Simulation<3> *simulation):
d_(3),
simulation3d_(simulation)
{}
process(void){ //wrapper function for kernel launching
switch(d_){
case 2:
kernel<2><<<..., ...>>>(...);
break;
}
case 3:
kernel<3><<<..., ...>>>(...);
break;
}
default:
break;
}
int d_;
union{
Simulation<2> *simulation2d_;
Simulation<3> *simulation3d_;
};
union{
Lattice<2> *lattice2d_d;
Lattice<3> *lattice3d_d;
};
};
したがって、私がやろうとしていること、つまり、テンプレート CUDA カーネルのラッパーを作成することを達成するためのより良い方法を知っているかどうか疑問に思っていました。
更新:上記の投稿を行った後に見つけた解決策をもう 1 つ追加したいと思います。C++ faq (ポイント 13-15)で示されているように、テンプレートの実装をソース ファイルに配置し、必要なテンプレートを明示的にインスタンス化できます。つまり、私の場合は 2 次元と 3 次元です。C++11 を使用すると、これをさらに一歩進めることができextern
、テンプレート定義にキーワードを導入して、コンパイル/リンク時間を節約できます。