beidou
#1
各位老师好:
我想在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定义为全局变量)
mzhang
#2
kernel内python的list是不支持的,Taichi scope内要使用Taichi自带的数据结构,这里可以写成 l1 = ti.Vector([1, 2, 3, 4])
beidou
#3
那kernel里面要怎么写呢?要把l2的引用传给l1
YuPeng
#4
就像@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)):
并且全部编译期一次性完成,没有运行时负担
1 Like