私のアプリケーションは、大量の計算に CUDA カーネルを使用しています。正当な理由から (この質問の範囲外)、共有オブジェクト/リンク モデルを使用して、それぞれが 1 つのホスト関数と 1 つの CUDA カーネルを含むオブジェクト ファイルを動的に読み込みます。extern
カーネルはそのようなカーネルの基本構造になることはできないため、次のようになります。
__global__ kernel() { ...code... }
extern "C" void call_kernel() {
<<<GRID,BLOCK,SHMEM>>>kernel();
}
カーネルを呼び出すことを唯一の目的とするホスト関数を使用します。私が使用する共有オブジェクトを構築するために:
nvcc -arch=sm_20 -m64 --compiler-options -fPIC,-shared -link -o kernel0.o kernel0.cu
アプリ全体でこれらのカーネルを大量に使用し、dlopen()
. すべて (ビルド/ロード/実行) が 1 台のマシン A にとどまっている場合、全体が正常に機能します。
しかし、共有オブジェクトをマシン B (cuda 4.1、NVIDIA C2050) でコンパイル/ビルドし、dlopen
後でマシン A (cuda 4.0、GTX 480) でコンパイル/ビルドすると、共有オブジェクトもビルドされた場合と同じ結果が得られません。マシン A で。
それは私には奇妙に聞こえます。.o
特定の GPU アーキテクチャに依存しない命令を含むCUBIN オブジェクトがファイルに埋め込まれていませんか?
ビルドとリンクに同じコンパイラ バージョンを使用することをお勧めします。繰り返しになりますが、共有オブジェクトを実行するのと同じマシン上でビルドしないのには十分な理由があります。