C++11 を必要とするプロジェクトがあるため、ファイルを 2 つのカテゴリに分けます。C++11 を使用するファイルと、C++03 を使用するため nvcc コンパイラと互換性があるファイルです。テンプレート関数ではないカーネルがある場合、モジュールをロードして関数名を見つけるのは簡単cuModuleGetDataEx
です。ただし、カーネルがテンプレートの場合、関数名は明示的な特殊化の後にマングルされます。これにより、CUDA ドライバー API を使用してモジュールをロードした後、関数へのハンドルを取得することが困難になります。たとえば、この関数を考えてみましょう。
template <class T, class SizeType>
global void
vector_add(const T* a, const T* b, T* c, const SizeType dim)
{
const SizeType i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < dim) { c[i] = a[i] + b[i]; }
}
これを PTX コードにコンパイルした後、マングルされた名前は_Z10vector_addIfjEvPKT_S2_PS0_T0_
. テンプレート カーネル関数をファイル内で手動で見つけて名前をコピーすることなく、ホスト コードから簡単に見つけて読み込むにはどうすればよいですか?