これは、プログラミングの問題というよりも、アルゴリズムの問題です。プレフィックス合計(または任意の)並列アルゴリズムを変更して、次のことを実現できるかどうか疑問に思っています。GPU上の2つの入力リストからO(N)時間未満で結果を生成したいと思います。
ルールは次のとおりです。キーの同じインデックスに含まれる値が小さくなるまで、データから最初の数値を実行します。
並列スキャンにマッピングしようとすると、現在のキーと比較するのに十分な距離まで運ばれた可能性のある以前のデータを知ることができないため、アップスイープで伝播するデータの値がわからないため、機能しません。 。この問題は、現在のインデックスと過去のすべてのインデックスを考慮する必要があるリップルキャリーを思い出させます。
繰り返しになりますが、並列スキャンのコードは必要ありません(それは素晴らしいことですが)。それがどのように実行できるのか、またはなぜ実行できないのかを理解するためにもっと探します。
int data[N] = {5, 6, 5, 5, 3, 1, 5, 5};
int keys[N] = {5, 6, 5, 5, 4, 2, 5, 5};
int result[N];
serial_scan(N, keys, data, result);
// Print result. should be {5, 5, 5, 5, 3, 1, 1, 1, }
スキャンをシリアルで実行するためのコードは次のとおりです。
void serial_scan(int N, int *k, int *d, int *r)
{
r[0] = d[0];
for(int i=1; i<N; i++)
{
if (k[i] >= r[i-1]) {
r[i] = r[i-1];
} else if (k[i] >= d[i]) {
r[i] = d[i];
} else {
r[i] = 0;
}
}
}