关于ti.func如何传入传出一个list

各位老师好:

我想在ti.func内传出一个list,然后在kernel中去接收这个list。

比如我有一个列表是l1,
在func中我把它赋值为[1,2,3,4]

我希望在kernel中调用这个func,然后得到改变后的值1,2,3,4

import taichi as ti
ti.init(arch=ti.cpu, debug=True, excepthook=True,
        cpu_max_num_threads=1, advanced_optimization=False)

@ti.func
def testFunc(l1):
    l1=[1,2,3,4]

@ti.kernel
def test():
    l2=[]
    testFunc(l2)
    print(l2)

test()

但是这样显然是不行的,得到如下的报错

请问有什么方法可以实现呢?(不希望把l1定义为全局变量)

kernel内python的list是不支持的,Taichi scope内要使用Taichi自带的数据结构,这里可以写成 l1 = ti.Vector([1, 2, 3, 4])

那kernel里面要怎么写呢?要把l2的引用传给l1

就像@mzzhang 说的,taichi目前不支持List作为 ti.kernel, ti.func的参数。

至于如何让 ti.func 的参数 pass by reference,
你可以看一下文档:https://docs.taichi.graphics/lang/articles/basic/syntax#advanced-arguments-1
我也写了一个小的实例:

import taichi as ti
ti.init()

@ti.func
def testFunc(v: ti.template()):
    v = ti.Vector([2,3,4,5])

@ti.kernel 
def test():
    v1 = ti.Vector([1,2,3,4])
    testFunc(v1)
    print(v1)

test()
# output: 2 3 4 5
1 Like

也可以

l1=ti.static([1,2,3,4])

ti.static里都是静态求值的,即使每个元素类型不同也没问题:

l1=ti.static([1,'hello',[3,4]])

好处是zip,enumerate等内置函数都可以用:

for i, val in ti.static(enumerate(l1)):

并且全部编译期一次性完成,没有运行时负担

谢谢!