この質問には詳細がありません。そこで、この質問を編集する代わりに、別の質問を作成することにしました。新しい質問は次のとおりです。コードを並列化できますか、それとも価値がありませんか?
CUDA で実行しているプログラムがあり、コードの一部がループ内で実行されています (以下に示すようにシリアル化されています)。このコードは、アドレスや NULL ポインターを含む配列内の検索です。すべてのスレッドが以下のコードを実行します。
while (i < n) {
if (array[i] != NULL) {
return array[i];
}
i++;
}
return NULL;
n
のサイズと配列array
は共有メモリにあります。NULL (最初の一致) とは異なる最初のアドレスにのみ関心があります。
コード全体 (コードの一部だけを投稿しました。コード全体は大きい) は高速で実行されますが、コードの「心臓部」(つまり、より繰り返される部分) は、ご覧のとおりシリアル化されています。この部分(検索)を最適化されたアルゴリズムで並列化できるかどうかを知りたいです。
私が言ったように、プログラムはすでにCUDA(およびデバイスの配列)にあるため、ホストからデバイスへ、またはその逆のメモリ転送はありません。
私の問題は次のとおりn
です。大きくありません。8を超えることは難しいでしょう。
並列化を試みましたが、「新しい」コードは上記のコードよりも時間がかかりました。
リダクションと最小演算を勉強していましたが、n
が大きい場合に役立つことを確認しました。
それで、何かヒントはありますか?効率的に、つまり低いオーバーヘッドで並列化できますか?