原子操作¶
在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:目前不支持)