原子操作

在Taichi中,增量赋值(例如,x[i] += 1 )自动即为 原子操作

警告

并行修改全局变量时,请确保使用原子操作。 例如,合计 x 中的所有元素,

  1. @ti.kernel
  2. def sum():
  3. for i in x:
  4. # 方式 1: 正确
  5. total[None] += x[i]
  6. # 方式 2: 正确
  7. ti.atomic_add(total[None], x[i])
  8. # 方式 3: 非原子操作因而会得到错误结果
  9. 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 的旧值。

例如,:

  1. x[i] = 3
  2. y[i] = 4
  3. z[i] = ti.atomic_add(x[i], y[i])
  4. # 现在 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/CUDAOpenGLMetal
i32OKOKOK
f32OKOKOK
i64OKEXTN/A
f64OKEXTN/A

(OK:已支持,EXT:需要扩展支持,N/A:目前不支持)