という名前のファイルにある次の CUDA プログラムについて考えてみましょうfoo.cu
。
#include <cooperative_groups.h>
#include <stdio.h>
__global__ void my_kernel() {
auto g = cooperative_groups::this_grid();
g.sync();
}
int main(int, char **) {
cudaLaunchCooperativeKernel( (const void*) my_kernel, 2, 2, nullptr, 0, nullptr);
cudaDeviceSynchronize();
}
このプログラムはあまり機能しませんが、有効なプログラムです (計算能力がグリッド全体を協調グループとしてサポートするのに十分な場合)。リンクをコンパイルして実行する必要があります。しかし、私はこれを取得します:
$ nvcc -o foo -gencode arch=compute_61,code=sm_61 foo.cu
ptxas fatal : Unresolved extern function 'cudaCGGetIntrinsicHandle'
びっくり!-l
特定の-L
フラグを追加しても役に立ちません。たとえば、次のようになります。
$ nvcc -o foo -gencode arch=compute_61,code=sm_61 foo.cu -L"/usr/lib/x86_64-linux-gnu/" \
-L"/usr/lib/x86_64-linux-gnu/stubs" -lcudadevrt -lcudart_static -lrt -lpthread -ldl
ptxas fatal : Unresolved extern function 'cudaCGGetIntrinsicHandle'
なぜこうなった?そして、nvcc コマンドラインをどのように変更して、未解決のシンボルを見つけられるようにすればよいでしょうか?
ノート:
- Devuan GNU/Linux 3.0 を使用しています。
- CUDA 10.1 はディストリビューション パッケージとしてインストールされるため、そのライブラリは の下にあり
/usr/lib/x86_64-linux-gnu
ます。 - GeForce 1050 Ti カードを搭載した x86_64 マシン。