私は C++ AMP でアルゴリズムを書き直していますが、アトミックな書き込み、より具体的にはatomic_fetch_addの問題に遭遇しました。これはどうやら整数専用ですか?
アトミックな方法で double_4 (または必要に応じて float_4) を追加する必要があります。C++ AMP のアトミックでそれを達成するにはどうすればよいですか?
私のコードが書き込みを制御するために使用できるロック変数を持つことは、本当に最善/唯一の解決策ですか? 実際には、出力 double の長いリストに対してアトミックな書き込みを行う必要があるため、基本的にすべての出力に対してロックが必要になります。
パフォーマンスを向上させるためにこれをタイル化することを既に検討しましたが、今は最初の繰り返しに過ぎません。
編集:すでに与えられた素早い回答に感謝します。ただし、質問を簡単に更新します。
次のロックを試みましたが、ワープ内の 1 つのスレッドがロックを通過すると、同じワープ内の他のすべてのスレッドがタグ付けされるようです。最初のワープスレッドがロックを取得することを期待していましたが、何かが欠けているに違いありません (cuda の時代からかなりの年月が経過しているため、私はばかになってしまったことに注意してください)。
parallel_for_each(attracting.extent, [=](index<1> idx) restrict(amp)
{
.....
for (int j = 0; j < attracted.extent.size(); j++)
{
...
int lock = 0; //the expected lock value
while (!atomic_compare_exchange(&locks[j], &lock, 1));
//when one warp thread gets the lock, ALL threads continue on
...
acceleration[j] += ...; //locked write
locks[j] = 0; //leaving the lock again
}
});
最初は共有変数に書き込み、タイル内のすべてのスレッドが完了した後にのみグローバル メモリに書き込む必要があるため、それほど大きな問題ではありませんが、この動作がわかりません。