2012-02-16 11 views
4

GPGPUの計算でCPUがプログラムコードをGPUに移動する方法に関する情報を探しています。インターネットは、データ転送に関する多くのマニュアルですが、命令やプログラムのロードに関するものではありません。CPUとGPU間の命令の転送

問題は次のとおりです。プログラムは、CPUによって処理されます.CPUは、各演算器で適切なフラグを使用してGPUを「構成」し、特定の操作を実行します。その後、データが転送され、処理されます。全部の操作はどのように行われますか? GPUに命令がどのように発行されますか?命令は何とかパケットがバスの帯域幅を利用するのですか?私は何か基本的なものを無視したかもしれないので、追加の情報は大歓迎です。

答えて

3

実際にはそれに関する情報はほとんどありませんが、その効果を過大評価しています。

カーネルコード全体が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ステージのデバイスにコピーされている可能性があります。

+0

私は物事がどのように行われているか、必ずしもパフォーマンスには関心がありません。特に、GPUが各カーネル内でどのようにループ/ if-elseを処理するか – amnl

+0

@amnl分岐については、[CUDA Cプログラミングガイド](http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)のセクション4.1で説明されています。 「ワープ[32連続スレッド]は一度に1つの共通命令を実行します....ワープのスレッドがデータ依存の条件分岐を経て分岐する場合、ワープは各分岐を連続的に実行しますそのパスにないスレッドを無効にし、すべてのパスが完了すると、スレッドは同じ実行パスに収束します。 – aland

関連する問題