2

findPackageCUDA.cmake から CUDA_COMPILE_PTX を使用して .cu ファイルを変換します。カーネルへの関数ポインターを取得しようとすると、次の問題に直面しています。

Kernel1 という名前のカーネルは、結果の .ptx ファイルから .entry-label を使用する場合、cuModuleGetFunction を介してのみ正しくロードできます (例: _Z7Kernel1Pj)。

問題は、.cu ファイルを再コンパイルする必要があるたびに、このラベルが変更される可能性があることです。定数char *で名前で参照すると、これは解決策になりません。

4

1 に答える 1

4

_Z7Kernel1Pj は C++ マングル名です。単純なシンボルが必要な場合は、 extern "C" を使用できます

extern "C" void Kernel1(...)

たとえば、カーネルを含むデフォルトの CUDA ビジュアル スタジオ プロジェクトを使用する場合

__global__ void addKernel(int *c, const int *a, const int *b)

これに対して cuobjdump -symbols を実行すると、壊れたシンボル名が表示されます

STT_FUNC         STB_GLOBAL   _Z9addKernelPiPKiS1_

extern "C" を使用する場合

extern "C" __global__ void addKernel(int *c, const int *a, const int *b)

シンボル名は次のようになります

STT_FUNC         STB_GLOBAL   addKernel

extern "C" を使用すると、関数のオーバーロードと名前空間が失われます

于 2012-08-01T20:21:27.313 に答える