我正在用 C++ AMP 重写一个算法,但遇到了原子写入的问题,更具体地说 atomic_fetch_add,这显然只适用于整数?
我需要以原子方式添加一个 double_4(或者如果我必须添加一个 float_4)。如何使用 C++ AMP 的原子实现这一点?
最好/唯一的解决方案真的有一个我的代码可以用来控制写入的锁变量吗?我实际上需要为一长串输出双打执行原子写入,所以我基本上需要为每个输出设置一个锁。
我已经考虑过平铺这个以获得更好的性能,但现在我只是在第一次迭代中。
编辑:感谢您已经给出的快速答案。不过,我对我的问题有一个快速更新。
我进行了以下锁定尝试,但似乎当经线中的一个线程越过锁时,同一经线中的所有其他线程都只是跟随。我期待第一个经线得到锁,但我一定错过了一些东西(请注意,自从我的 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
}
});
这不是一个大问题,因为我应该首先写入一个共享变量,并且只有在一个 tile 中的所有线程都完成后才将它写入全局内存,但我就是不理解这种行为。