原子操作
在Taichi中,增量赋值(例如,x[i] += 1
)自动即为 原子操作。
警告
并行修改全局变量时,请确保使用原子操作。 例如,合计 x
中的所有元素,
@ti.kernel
def sum():
for i in x:
# 方式 1: 正确
total[None] += x[i]
# 方式 2: 正确
ti.atomic_add(total[None], x[i])
# 方式 3: 非原子操作因而会得到错误结果
total[None] = total[None] + x[i]
注解
当将原子操作应用于局部值时,Taichi编译器将尝试将这些运算降级为它们的非原子对应值。
除了增量赋值(augmented assignment)之外,显式的原子操作(例如 ti.atomic_add
)也可以原子地进行读取-修改-写入。 这些操作还会返回第一个参数的 旧值 。
以下是所有显式原子操作的列表:
ti.``atomic_add
(x, y)
ti.``atomic_sub
(x, y)
原子地计算 x + y
或 x-y
并将结果存储在 x
中。
返回: | x 的旧值。 |
---|
例如,:
x[i] = 3
y[i] = 4
z[i] = ti.atomic_add(x[i], y[i])
# 现在 x[i] = 7, y[i] = 4, z[i] = 3
ti.``atomic_and
(x, y)
ti.``atomic_or
(x, y)
ti.``atomic_xor
(x, y)
原子式计算 x&y
(按位和), x | y
(按位或),或者 x ^ y
(按位异或),并将结果存储在 x
中。
返回: | x 的旧值。 |
---|
注解
每个后端所支持的原子操作:
类型 | CPU/CUDA | OpenGL | Metal |
---|---|---|---|
i32 | OK | OK | OK |
f32 | OK | OK | OK |
i64 | OK | EXT | N/A |
f64 | OK | EXT | N/A |
(OK:已支持,EXT:需要扩展支持,N/A:目前不支持)