実際にはそれに関する情報はほとんどありませんが、その効果を過大評価しています。
カーネルコード全体がGPUに1回だけロードされます(最悪の場合、1回のカーネル呼び出しで、実際にはアプリケーションごとに1回実行されるように見えます)。 CPUからの介入なしにGPU。したがって、カーネル全体のコードは、カーネルが呼び出される前のどこかのチャンクにコピーされます。コードサイズを見積もるために、私たちの自家製MDパッケージ(52個のカーネル、一部は150行以上のコード)のすべてのGPUコードの.cubin
のサイズはわずか91KiBですので、ほぼすべてのケースでコード転送時間はごくわずかです。
ここにありますが、私は公式ドキュメントで見てきたどのような情報である:CUDA Driver APIで
、コードはデバイス上のあなたはCUDAドライバAPIを遅延しようとしません
cuModuleLoad
関数を呼び出すときにロードされますモジュールによって必要とされるリソースを割り当てます( )。モジュールが必要とする機能やデータ (定数とグローバル)のためのメモリを割り当てることができない場合は、 cuModuleLoad()は理論的に
を失敗し、あなたが持っている場合、あなたは、モジュールをアンロードし、再度ロードする必要がありますあまりにも多くの定数(または静的に割り当てられたグローバル)メモリを同時に使用してロードするいくつかのモジュールですが、これはまれであり、通常はコンテキストの作成直後にアプリケーション起動ごとに1回だけcuModuleLoad
を呼び出します。
CUDA Runtime APIは、モジュールのロード/アンロードを制御する手段は提供していませんが、初期化中に必要なコードがすべてデバイスにロードされているように見えます。
OpenCL SpecsはCUDAドライバAPIほど具体的ではありませんが、コードはclBuildProgram
ステージのデバイスにコピーされている可能性があります。
私は物事がどのように行われているか、必ずしもパフォーマンスには関心がありません。特に、GPUが各カーネル内でどのようにループ/ if-elseを処理するか – amnl
@amnl分岐については、[CUDA Cプログラミングガイド](http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)のセクション4.1で説明されています。 「ワープ[32連続スレッド]は一度に1つの共通命令を実行します....ワープのスレッドがデータ依存の条件分岐を経て分岐する場合、ワープは各分岐を連続的に実行しますそのパスにないスレッドを無効にし、すべてのパスが完了すると、スレッドは同じ実行パスに収束します。 – aland