2011-08-17 22 views
2

CUDAを使用してGPUで以下の一般的なやり方を理解したいと思います。udaアルゴリズム構造

私はこのようになりますアルゴリズムがあります。

void DoStuff(int[,] inputMatrix, int[,] outputMatrix) 
{ 
    forloop { 
    forloop { 
     if (something) { 
       DoStuffA(inputMatrix,a,b,c,outputMatrix) 
     } 
     else { 
       DoStuffB(inputMatrix,a,b,c,outputMatrix) 
     } 
    } 
    } 
} 

DoStuffAとDoStuffBはCUDA例はたくさんのを持っているという単純なparalleizable機能(例えばマトリックス行の操作を行っている)です。

私がしたいのは、メインアルゴリズム "DoStuff"をGPUに入れ、DoStuffAとDoStuffBを必要に応じて呼び出す方法です(並列に実行する)。外側のループ部分はシングルスレッドであるが、内側の呼び出しはそうではない。

私が見た例は、get-goからマルチスレッド化されているようです。私は、外部の世界から単一のGPUベースのメソッドを呼び出すだけで、並列ビットのすべてをそれ自身で制御する方法があると仮定します。

+0

forloopsとは何ですか?彼らは入力に対する単純な反復子なのか、それとももっと複雑なものですか? DoStuffの1回の呼び出しで条件(何か)が一定であるのですか、それとも出力行列の状態に依存していますか? – talonmies

+0

いいえ、forloopsは単純なイテレータではなく、条件も複雑です。要約すると、私は "DoStuff"メソッドをCPU上で実行してから、DoStuffAとDoStuffBのGPUを何度も呼び出すことができますが、CPUからGPUへの繰り返しのコピーを避けたい - つまりGPUにDoStuffを置く。 –

+3

詳細をあなたの質問に編集できますか?これは非常に抽象的な質問であり、建設的に答えることは非常に難しいでしょう。スレッドについて考えるのではなく、データの並列処理について考える。 GPU上で実行されるカーネルは、データの並行作業のみを行うことができ、新しい作業をディスパッチしたり、他のカーネルを実行することはできません。したがって、通常、「内部」foreachループはGPU上で動作し、「outer」ループはコンバージェンステストなどをホスト上に含みます。質問を洗練する際にはそのことを念頭に置いておいてください。実行モデルの理解はちょっとしたものです。 – talonmies

答えて

1

  • アップロード入力行列
  • がために行うメモリのブロックにそれは、データ間のループのためにお互いにどのように関連するかに依存しますが、大体、私は

    1. パックすべての入力行列だろう1つのブロック

    この方法でDoStuffAとDoStuffB

  • ダウンロード出力行列のカーネルを呼び出し、CPUにループ最大の問題は、各カーネルを呼び出すためのオーバーヘッドです。あなたの入力データが大きければそれほど悪くはありません。

  • 関連する問題