如何阻止taichi重复编译?

如下面代码所示,我建立了很一个有taichi kernel方法的类,然后创建了很多个类对象,似乎每个对象第一次执行taichi kernel函数时都会反复的编译,所以导致第一次循环画的时间尤其长,有什么办法避免它反复编译?

import taichi as ti
from time import time
ti.init(arch = ti.cuda)

@ti.data_oriented
class some_class():
    def __init__(self):
        self.q = ti.field(float, shape = 100000)
    
    @ti.kernel
    def run(self):
        for i in ti.grouped(self.q):
            self.q[i] = ti.random()

obj = []
for i in range(500):
    obj.append(some_class())

t1 = time()
for i in range(500):
    obj[i].run()
print(time()-t1)

t1 = time()
for i in range(500):
    obj[i].run()
print(time()-t1)

t1 = time()
for i in range(500):
    obj[i].run()
print(time()-t1)

运行结果:

[Taichi] version 1.6.0, llvm 15.0.1, commit f1c6fbbd, win, python 3.11.4
[Taichi] Starting on arch=cuda
35.50552034378052
0.012999296188354492
0.013999700546264648

此外还有一个问题,是不是taichi对field变量的个数有限制?我创建512个field的话,就会报错

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

有办法绕开这个限制吗?

Taichi目前data_oriented实现确实有重复编译的问题,主要原因是那个self在Kernel编译的时候没有被处理成Type,而是处理成Instance,所以导致每个新对象都会重复编译一次。

如果你的代码比较简单,可以考虑不使用data_oriented来避开这个问题

还有一个办法是使用Taichi新加的Argument Pack功能来替代data_oriented。你可以先安装nightly:
pip install -i https://pypi.taichi.graphics/simple/ taichi-nightly

然后参考这个文档:Taichi Argument Pack | Taichi Docs