Mpm88是否需要用到ti.atomic_add

今天突然发现在mpm88代码的P2G循环中

@ti.kernel
def substep():
    for p in x:
        .......
        for i in ti.static(range(3)):
            for j in ti.static(range(3)):
                offset = ti.Vector([i, j])
                ......
                grid_v[base+offset] += weight*(p_mass*v[p]+affine@dpos)
                grid_m[base+offset] += weight*p_mass

这段代码中,在循环累加grid_v和grid_m时是否需要用到ti.atomic_add呢,因为貌似在有些时候x[i]+=1在并行时仍会产生撞车的现象https://forum.taichi-lang.cn/t/topic/2663/7。同时想问一问如果采用原子加法,对gpu并行计算性能的影响大嘛,谢谢!

Taichi 中的 += 是原子操作,如果想强制不用原子操作可以写成 a = a + b。atomic_add 的好处在于可以获得返回值(也就是 += 后左侧变量的值),如果不需要这个返回值的话 += 和 atomic_add 没有区别。

原子操作对于 cpu 或是 gpu 的性能肯定是有影响的,但原子操作的具体开销在不同的硬件架构和应用下差距很大,我觉得很难一概而论。