问题描述:我在Taichi Kernel中,想记录一个dataclass在执行某个函数前后的属性值(属性的变量类型为ti.math.vec2,我只记录了它的一个分量),以判断执行函数带来的效果。
在我原先的版本中1.4.0中,程序的运行符合我预期的效果。但当我更新1.7.2之后,函数执行后记录的属性值并没有发生应有的变化。当我把执行前的变量记录语句注释后,预期的属性值变化又出现了。猜测可能是两个变量赋值语句被编译成了一句话。另外,值得注意的是,这种现象只出现在了ti.math.vec2的分量中,如果我执行前后记录的是ti.math.vec2本身,那变量更新则是正常的。
复现代码如下:
import taichi as ti
ti.init(arch=ti.cpu, default_fp=ti.f64, fast_math = False)
@ti.dataclass
class Circle:
center: ti.math.vec2
@ti.func
def move(self):
self.center = self.center + 1
Circles = Circle.field(shape = (10))
Circles[0].center = ti.math.vec2(1.0)
Circles[1].center = ti.math.vec2(1.0)
Circles[2].center = ti.math.vec2(1.0)
@ti.kernel
def main():
r1 = Circles[0].center
x1 = r1[0]
Circles[0].move()
r2 = Circles[0].center
x2 = r2[0]
print(x1, x2)
# 1.00, 2.00
x1 = Circles[1].center[0]
Circles[1].move()
x2 = Circles[1].center[0]
r3 = Circles[1].center
x3 = r3[0]
print(x1, x2, x3)
# 1.00, 1.00, 2.00
# x1 = Circles[1].center[0]
Circles[2].move()
x2 = Circles[2].center[0]
r3 = Circles[2].center
x3 = r3[0]
print(x2, x3)
# 2.00, 2.00
main()