SetAtomicAdd原子累加问题求助
我想知道SetAtomicAdd会保证不同核之间也是原子的操作吗?
如果说我每个核心原子累加一个数
core0 [2, 0, 0, 0, 0, 0, 0, 0]
core1 [0, 3, 0, 0, 0, 0, 0, 0]
core2 [0, 0, 1, 0, 0, 0, 0, 0]
core3 [0, 0, 0, 1, 0, 0, 0, 0]
core4 [0, 0, 0, 0, 1, 0, 0, 0]
core5 [0, 0, 0, 0, 0, 1, 0, 0]
core6 [0, 0, 0, 0, 0, 0, 3, 0]
core7 [0, 0, 0, 0, 0, 0, 0, 1]
最后我希望得到的结果是
[2 3 1 1 1 1 3 1]
但实际上的结果是(随机一个出现有值)
[0, 0, 0, 0, 0, 1, 0, 0]
SetAtomicAdd原子累加问题求助
我想知道SetAtomicAdd会保证不同核之间也是原子的操作吗?
如果说我每个核心原子累加一个数
core0 [2, 0, 0, 0, 0, 0, 0, 0]
core1 [0, 3, 0, 0, 0, 0, 0, 0]
core2 [0, 0, 1, 0, 0, 0, 0, 0]
core3 [0, 0, 0, 1, 0, 0, 0, 0]
core4 [0, 0, 0, 0, 1, 0, 0, 0]
core5 [0, 0, 0, 0, 0, 1, 0, 0]
core6 [0, 0, 0, 0, 0, 0, 3, 0]
core7 [0, 0, 0, 0, 0, 0, 0, 1]
最后我希望得到的结果是
[2 3 1 1 1 1 3 1]
但实际上的结果是(随机一个出现有值)
[0, 0, 0, 0, 0, 1, 0, 0]
LocalTensor<float> tmpAtomicAdd = tmpAtomicAddBuf.AllocTensor<float>(); LocalTensor<int32_t> tmpAtomicAddInt = tmpAtomicAdd.ReinterpretCast<int32_t>(); Duplicate(tmpAtomicAddInt, 0, ALIGN_4B_32B); tmpAtomicAddInt.SetValue(GetBlockIdx(), expertCount.GetValue(0)); DumpTensor(tmpAtomicAddInt, 112, 8); Duplicate(tmpAtomicAddInt, 1, 8); PipeBarrier<PIPE_ALL>(); SetAtomicAdd<int32_t>(); DataCopy(expertCountGm, tmpAtomicAddInt, ALIGN_4B_32B); SetAtomicNone(); PipeBarrier<PIPE_ALL>(); tmpAtomicAddBuf.FreeTensor(tmpAtomicAdd);