关于field原子存取的疑问

我使用了一个field作为存储深度纹理,shape和屏幕像素相同,需要读取一个像素储存的数值和一个新数值进行比较,之后可能把新数值存入该像素。
在具体运行时,我遇到的问题是,多个粒子可能将深度投影到同一个像素上,如深度-1和-2,这个像素的原深度为-3,我希望储存数值最大的深度,即-1,但是GPU同时运行两个线程,将-3分别与-1和-2进行比较,最终存入的可能是-1也可能是-2.
我希望有一种方法能将field取出像素和存入像素的过程加锁,我尝试了loop_config但是不起作用。
粒子的数量级是一万以上。

ti.loop_config(block_dim=1024)
for p in self.sim.x:
  pos = self.sim.x[p]
  temp = self.view_mat @ ti.Vector([pos[0], pos[1], pos[2], 1.0])
  view_pos = ti.Vector([0.0, 0.0, 0.0])
  view_pos[0] = temp[0] / temp[3]
  view_pos[1] = temp[1] / temp[3]
  view_pos[2] = temp[2] / temp[3]
  view_pos[0] = (view_pos[0] + 1.0) / 2 + 0.0
  view_pos[1] = (view_pos[1] + 1.0) / 2 + 0.0
  r = 100
  center_x = int(view_pos[0] * self.screen_res[0])
  center_y = int(view_pos[1] * self.screen_res[1])
  base_x = (center_x - r)
  base_y = (center_y - r)
  r2 = 2 * r
  for i in (range(r2)):
      for j in (range(r2)):
          l = ti.sqrt((r - i) * (r - i) + (r - j) * (r - j))
          if l < r:
              depth_center = view_pos[2]
              depth_new = depth_center + ti.sqrt(r * r - l * l) / self.screen_res[0]
              self.depth_texture[base_x + i, base_y + j][0] = ti.max(depth_new, self.depth_texture[base_x + i, base_y + j][0])

找到能用的API了,是ti.atomic_max,把代码的最后一行改成

ti.atomic_max(self.depth_texture[base_x + i, base_y + j][0], depth_new)

即可