升级0.8.10 报错

今天升级了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()

你可以这样试试么?

self.triangle = ti.field(ti.f32, 3)
ti.root.dense(ti.i, 8).place(self.triangle)

不行哦,
报错:This variable has been placed

我想了下,这样确实是不行的。

其实出现你说的问题,是因为太极语言的规则是先定义好数据类型,然后再计算。 数据类型的定义和计算是分开的。

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

嗯,换位置是可以的,先定义后计算这个规则是新版本加的吗?我看升级前的版本还是可以的, 以后这算是硬性规范了吧

你好,方便把代码贴上来么?先定义再计算是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执行也报错了,之前升级前是不报的 :joy:

其实报错才应该符合我们的预期。如果想要动态的构建field,还是推荐我之前给出的参考文档。

好的,谢了