2016-08-01 4 views
0

現在、pycuda/cuda経由でGPUのいくつかの数値メソッドをプログラミングしています。自分のカーネルを作成しています。いくつかの点で、私は少なくとも1000結合ODEのエラーを推定する必要があります。私は1000以上のエントリを持つベクトルのカップルをコピーする必要はありませんので、私は基本的な最大機能である(ポストの下に)カーネルを作成しました。これらの%(T)と%(N)は実行時に作成している文字列の置換で、この質問には関係ありません(Tは複雑なデータ型を表し、Nは結合ODEの数を表します)。GPUカーネルブロックサイズ/スレッドなしグリッドサイズ

私の質問は、並列計算が必要ないため、スレッドを使用しないことです。この関数をPythonで呼び出すと、ブロックサイズまたはグリッドサイズを指定する必要がありますか?カーネルの起動で

 __global__ void get_error(double *max_error,%(T)s error_vec[1][%(N)s]) 
    { 
     max_error[0]=error_vec[0][0].real(); 
     for(int ii=0;ii<%(N)s;ii=ii+1) 
     { 
      if(max_error[0] < error_vec[0][ii].real()) 
      { 
       max_error[0]=error_vec[0][ii].real(); 
      } 
     } 
     return; 
    } 
+2

ブロックサイズが1でグリッドサイズが1の場合、GPUで実行スレッドが1つだけ正確に実行されます。 –

+0

@RobertCrovellaありがとうございます。スレッドIDにリンクされた変数はありませんが、gpuは実行するスレッドを1つ使用しますか? – malxmusician212

+1

が正しい。 C/C++プログラマとしてあなたの知識を信じてください。 –

答えて

1

、GPU上に紡糸されるスレッドの合計数は、起動のために指定されたグリッドサイズとブロックサイズとの積に等しいです。

これらの値は両方とも正の整数でなければならないため、これらの唯一可能な組み合わせは1,1であり、1つのスレッドの起動を作成します。

CUDAカーネルは、組み込み変数(例えば、blockIdx、など)に特定の参照を行う必要はありませんが、スレッド間の動作を区別するために通常そうします。スレッドが1つしか起動していない場合は、これらの変数を使用する特別な理由はなく、そうする必要はありません。

シングルスレッドのみのCUDAカーネルの起動は、作業を実行するための実行方法ではありませんが、実行するのが便利な特定のケースがあり、アプリケーション全体に大きなパフォーマンスの影響を与えません。

あなたの提案したカーネルがスレッドパラレルカーネル(なぜなら、max-finding reductionを実行しているように見えます)として再作成できないのは私には分かりませんが、それはあなたの質問とは別のようです。

+0

どのようにして最大限正確に最大値を見つけることができましたか? – malxmusician212

+0

基本的なアルゴリズムは並列削減と呼ばれ、[よく文書化されています](http://developer.download.nvidia.com/assets/cuda/files/reduction.pdf)。説明のために、ほとんどの処理では、削減操作はすべての要素の合計であると仮定していますが、すべての要素の最大値(またはすべての要素の最小値)を求めるプロセスはほんのわずかです。 [ここで](http://stackoverflow.com/questions/25195874/cuda-using-grid-strided-loop-with-reduction-in-shared-memory)は、最大探索の減少を議論する 'cuda'タグの質問です。 –

+0

すごく、ありがとう@RobertCrovella! – malxmusician212

関連する問題