9

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_. テンプレート カーネル関数をファイル内で手動で見つけて名前をコピーすることなく、ホスト コードから簡単に見つけて読み込むにはどうすればよいですか?

4

1 に答える 1

1

Blockquote C++11 を必要とするプロジェクトがあります。

それは冗談に違いありません。あなたのプログラムにはプロトタイプ コンパイラが必要です...使用しているコンパイラについては言及していませんが、gcc のように見えます。

コンパイラを知る

あなたの CUDA 部分は C++11 を必要としないと確信しています。すべてを C++03 ファイルと一緒に配置し、C++11 proto-compiler-generated-executable とリンクする必要がある場合はライブラリを使用して、いつものように行ってください。それは最先端です。

于 2012-05-29T05:47:06.143 に答える