请教一个RuntimeError的问题如何解决

在跑代码的时候遇到了这么一个问题:
RuntimeError: [snode_tree_buffer_manager.cpp:taichi::lang::SNodeTreeBufferManager::allocate@44] LLVM backend supports up to 32 snode trees
然后跑着跑着就结束了,该如何解决呢?


  File "D:\ANACONDA\lib\site-packages\taichi\lang\util.py", line 207, in wrapped
    return func(*args, **kwargs)

  File "D:\ANACONDA\lib\site-packages\taichi\lang\matrix.py", line 1351, in __setitem__
    self.initialize_host_accessors()

  File "D:\ANACONDA\lib\site-packages\taichi\lang\field.py", line 204, in initialize_host_accessors
    taichi.lang.impl.get_runtime().materialize()

  File "D:\ANACONDA\lib\site-packages\taichi\lang\impl.py", line 322, in materialize
    self.materialize_root_fb(not self.materialized)

  File "D:\ANACONDA\lib\site-packages\taichi\lang\impl.py", line 313, in materialize_root_fb
    root.finalize()

  File "D:\ANACONDA\lib\site-packages\taichi\snode\fields_builder.py", line 158, in finalize
    _ti_core.finalize_snode_tree(_snode_registry, self._ptr,

RuntimeError: [snode_tree_buffer_manager.cpp:taichi::lang::SNodeTreeBufferManager::allocate@44] LLVM backend supports up to 32 snode trees

你可以贴出来你的代码么?

根据Runtime Error,可以看出来你创建的Snode tree太多了。一般我们推荐你在调用任何kernel之前就把所有的field定义好。

果然是的,我在一个循环语句里定义了一个field。我把它拿到循环外面就一直可以跑动了。我的代码还没写完,现在还是个半成品,等我写好了上传作业区哈。 :sunglasses:

嗯嗯,好滴。期待你的作业,哈哈。

请问,还有别的方法解决这个问题吗?
因为我需要先做一个循环确定我的某个field的shape的大小。

可以先把数据放numpy数组里,确定好shape和数据后再定义field的shape,或者预定一个较大长度的field,在你循环里写入,再或者用稀疏数据结构的dynamic,动态的ti.append,

@dudu 我分享一下我这一块的实现方式:采用dynamic方式。

#这一块在初始化模块里
        self.IndexNN                = ti.field(                         dtype=ti.f32)           # index 2*N的标量场
        self.ListIndexNN            = ti.root.dense(ti.j, 2).dynamic(ti.i, self.max_length)
        self.ListIndexNN.place(self.IndexNN)
#因为我写代码那会ti.append函数只能接受整型,所以我对self.IndexNN 这个field的下标开了个field,现在这个函数应该修改了,所以可以直接append浮点了。
        self.A2B                    = ti.field(                         dtype=ti.u32)           # index 2*N的标量场
        self.ListA2B                = ti.root.dense(ti.j, 2).dynamic(ti.i, self.max_num_plumes)
        self.ListA2B.place(self.A2B)

#然后就可以append了,下面这一块可以用于你自己的其他子函数里进行场的定义值
for i in range(Number):
        ti.append(self.ListA2B, 0, i)                                                  
        ti.append(self.ListA2B, 1, i)


十分感谢

感谢帮助