今天升级了taichi版本,到最新的0.8.1,发现一个奇怪的报错,在声明完field place的时候,如下代码执行会报错,:
RuntimeError: These field(s) are not placed:
============================================
Please consider specifying a shape for them. E.g.,
x = ti.field(float, shape=(2, 3))
Process finished with exit code 1
但是如果把ti.root.dense(ti.i, 8).place(self.triangle) 放到self.max_boundary[0] = ti.Vector([1.0, 1.0, 1.0])前面就不会报错,这是有什么新语法要求,还是bug呢?
import taichi as ti
ti.init(arch=ti.cuda)
@ti.data_oriented
class Demo():
def __init__(self):
self.triangle = ti.Vector.field(3, dtype=ti.f32)
self.max_boundary = ti.Vector.field(3, dtype=ti.f32, shape=(1))
@ti.pyfunc
def set_val(self):
self.max_boundary[0] = ti.Vector([1.0, 1.0, 1.0])
ti.root.dense(ti.i, 8).place(self.triangle)
d=Demo()
d.set_val()
YuPeng
#2
你可以这样试试么?
self.triangle = ti.field(ti.f32, 3)
ti.root.dense(ti.i, 8).place(self.triangle)
不行哦,
报错:This variable has been placed
YuPeng
#4
我想了下,这样确实是不行的。
其实出现你说的问题,是因为太极语言的规则是先定义好数据类型,然后再计算。 数据类型的定义和计算是分开的。
ti.root.dense(ti.i, 8).place(self.triangle)
是一个定义数据的语句。 self.max_boundary[0] = ti.Vector([1.0, 1.0, 1.0])
是赋值操作,属于计算。所以他们两个位置调换是可以的。
不过目前太极也支持了动态定义数据类型,这个参考:Fields (advanced) | Taichi Docs
嗯,换位置是可以的,先定义后计算这个规则是新版本加的吗?我看升级前的版本还是可以的, 以后这算是硬性规范了吧
YuPeng
#6
你好,方便把代码贴上来么?先定义再计算是Taichi老版本的限制,目前应该没有类似的限制。
代码就是最开始发的这个
import taichi as ti
ti.init(arch=ti.cuda)
@ti.data_oriented
class Demo():
def __init__(self):
self.triangle = ti.Vector.field(3, dtype=ti.f32)
self.max_boundary = ti.Vector.field(3, dtype=ti.f32, shape=(1))
@ti.pyfunc
def set_val(self):
self.max_boundary[0] = ti.Vector([1.0, 1.0, 1.0])
ti.root.dense(ti.i, 8).place(self.triangle)
d=Demo()
d.set_val()
奇怪,现在我把taichi回退到0.8.8执行也报错了,之前升级前是不报的 
YuPeng
#8
其实报错才应该符合我们的预期。如果想要动态的构建field,还是推荐我之前给出的参考文档。