最後の Xmins を調べて、float[] 内のすべての値の平均を計算するカーネルがある場合、すべてのスレッドが同じコード行を同時に実行していないと、パフォーマンスが低下しますか?
例: @ x=1500 とします。過去 2 時間に 500 個のデータ ポイントがあります。
@ x = 1510、過去 2 時間に 300 個のデータ ポイントがあります。
x = 1500 のスレッドは 500 の場所をさかのぼる必要がありますが、x = 1510 のスレッドは 300 しかさかのぼらないため、後のスレッドは最初のスレッドが終了する前に次の位置に移動します。
これは通常問題ですか?
編集:コード例。申し訳ありませんが、CUDAfy.net を使用する予定だったので C# です。うまくいけば、実行する必要があるプログラミング構造のタイプの大まかなアイデアが得られます (実際のコードはより複雑ですが、同様の構造です)。これが GPU / コプロセッサに適しているのか、それとも単に CPU に適しているのかについてのコメントをいただければ幸いです。
public void PopulateMeanArray(float[] data)
{
float lookFwdDistance = 108000000000f;
float lookBkDistance = 12000000000f;
int counter = thread.blockIdx.x * 1000; //Ensures unique position in data is written to (assuming i have less than 1000 entries).
float numberOfTicksInLookBack = 0;
float sum = 0; //Stores the sum of difference between two time ticks during x min look back.
//Note:Time difference between each time tick is not consistent, therefore different value of numberOfTicksInLookBack at each position.
//Thread 1 could be working here.
for (float tickPosition = SDS.tick[thread.blockIdx.x]; SDS.tick[tickPosition] < SDS.tick[(tickPosition + lookFwdDistance)]; tickPosition++)
{
sum = 0;
numberOfTicksInLookBack = 0;
//Thread 2 could be working here. Is this warp divergence?
for(float pastPosition = tickPosition - 1; SDS.tick[pastPosition] > (SDS.tick[tickPosition - lookBkDistance]); pastPosition--)
{
sum += SDS.tick[pastPosition] - SDS.tick[pastPosition + 1];
numberOfTicksInLookBack++;
}
data[counter] = sum/numberOfTicksInLookBack;
counter++;
}
}