私はCuda内に2つの配列を持っています。データがキューに入れられていない配列にデータを効率的に挿入する
int *main; // unsorted
int *source; // sorted
私のアルゴリズムの一部は、ソース配列からメイン配列に新しいデータを定期的に挿入する必要があります。メイン配列内の位置がゼロの場合は、空であるとみなされるため、ソース配列の値を取り込むことができます。
これを実行する最も効率的な方法が何であるか、私はいくつかのアプローチを試しましたが、ここで行われるパフォーマンスの向上はまだあると思います。
現在、メイン配列の内容をメイン配列の最後までシャッフルして、配列の先頭にすべてのゼロ値を残して、挿入を行いますソースからはほんのわずかです。ソートは、32ビットではなく1つのビットを反復するように変更されました。これは、入力上の単純なスイッチで動作します。
input[i] = source[i] > 1 ? 1 : 0
これは既に効率的な方法ですか?私は戦術的に配備されたatomicAddを使って何かを得ることができないのだろうかと思っています。
__global__ void find(int *destination, int *indices, const int N)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if((destination[idx] == 0)&&(count<elements_to_add))
{
indices[count] = idx;
atomicAdd(&count, 1);
}
}
__global__ void insert(int *destination, int *indices, int *source, const int N)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if((source[idx] > 0)&&(indices[idx] > 0))
{
destination[indices[idx]] = source[idx];
}
}
find<<<G,T>>>(...);
insert<<<G,T>>>(...);
現時点ではソース配列を介して多くのアイテムを挿入していませんが、将来変更される可能性があります。
これは、以前に解決された共通の問題であるように思えます。推力ライブラリが役立つかもしれないと思っていますが、私が試しているものに対しては、達成するために(私はすでに持っているコードとあまりよくきちんと合っていません)
経験豊富なCuda開発者の意見が高く評価されました!
ソースに要素を挿入するときに要素の順序を保持する必要がありますか? – Farzad
いいえ、ソースの要素の順序を保持する必要はありません。 – Phill
。なぜこれがダウンしていたのか、2度の投票はありません。 – Phill