原子操作

在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 + yx-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:目前不支持)