关于多次建立同一field的问题:如何得到我想要的输出

在我的代码中,前处理时需要反复建立field,但是这个field占用空间比较大,因此在用完后需要手动销毁。如下为简化代码:

import taichi as ti
ti.init()

@ti.data_oriented
class B(object):
    def __init__(self):
        self.x=ti.field(int)
        fb=ti.FieldsBuilder()
        fb.dense(ti.i,1).place(self.x)
        self.snode_tree=fb.finalize()
        
    def clear(self):
        self.snode_tree.destroy()

@ti.data_oriented
class A(object):
    def __init__(self):
        self.n=12345
        
    def init(self):
        self.b=B()
        self.x=ti.field(int)
        fb=ti.FieldsBuilder()
        fb.dense(ti.i,self.n).place(self.x)
        self.snode_tree=fb.finalize()
        
    def clear(self):
        self.snode_tree.destroy()
        self.b.clear()
        del self.b
        
    @ti.kernel
    def k(self, m: int):
        for i in range(self.n):
            self.x[i] = m * i
            self.b.x[0] += m
            
    def start(self):
        self.init()
        self.k(1)
        print(self.x[34], self.b.x[0]) # -> output: 34 12345 // expected output: 34 12345
        self.clear()
        del self.x
        
        self.init()
        self.k(2)
        print(self.x[34], self.b.x[0]) # -> output: 0 24690 // expected outpu: 68 24690
        self.clear()
        del self.x
        
a=A()
a.start()

我想要得到的输出为:

34 12345
68 24690

然而实际输出为:

34 12345
0 24690

请问该如何修改这段代码呢

捞一捞:sob: :sob: :sob:

我这边确实能复现这个问题,在看原因

好像只可以用一个FieldsBuilder

您好,请问您找到原因了码

不好意思还在排查原因,预计下周结束前可以搞定

不好意思回复的比较晚,这个问题在最新的master上应该已经解决了。你可以尝试安装一个taichi-nightly:
python3 -m pip install taichi-nightly -i https://pypi.taichi.graphics/simple/,应该可以产出正确的结果。

谢谢

好想还是不行
Successfully installed taichi-nightly-1.6.0.post20230322

你要不要试试把原来的taichi卸载,再装nightly?

我卸载taichi, 安装taichi-nightly,还是不对

eleven@eleven:~/work/tiDEMPM_v0.2/test/pythonTesting$ python field_builder.py
[Taichi] version 1.6.0, llvm 15.0.4, commit d4013266, linux, python 3.8.10
[Taichi] Starting on arch=x64
34 12345
0 24690

欸我突然意识到可能是offline_cache导致的,你可以试试在ti.init()的时候加上这个嘛:ti.init(offline_cache=False)

还不行的话我去找之前能复现的同事问一下,也有小概率是硬件区别导致的…

加上 offline_cache=False 还是不对

发现不同硬件对这个问题的复现有影响,初步看来是print引起的。你要是着急的话可以先试试把第一个print删除,后面第二个print的结果应该就对了。

我再debug一下print的问题

已经修复啦:[bug] Invalid Field cache, RWAccessors cache, and Kernel cache upon SNodeTree destruction by jim19930609 · Pull Request #7704 · taichi-dev/taichi · GitHub