@ti.kernel的编译时间问题

在一个python文件A中import另一个python文件B,B中写了很多由用户自定义的taichi函数,这些函数在A中被调用。请问在import B的时候就已经针对B中的taichi函数进行了编译吗?还是等到A中调用B中的kernel函数时临时编译调用的函数呢?
具体问题是这样的我写了两个python文件time_iter.py和 user_defined_functions.py,后一个python文件是作为插件使用的,在程序运行时需要频繁更改模型,因而自定义的taichi函数被import 进入time_iter中再运行。这些kernel函数中,都使用了ti.types.ndarray()类型的形参,相当于从python域传递了numpy数组进去,这个数组的长度不是固定的,需要在运行时确定,直到调用这些kernel函数的时候,这些数组才确定下来。

然后运行程序的时候一直报错,调用函数的时候taichi无法找到函数的代码。后来我不使用import方法,而是直接把user_defined_functions.py中的函数在time_iter中定义了,在当前文件中调用,就不会报错了。我个人猜测错误的原因是import的时候运行到@ti.kernel时就把函数编译了,然而当时函数所需要的数组类型的形参还没有python值,无法确定其长度,可能编译中出现了某些问题,等到time_iter调用的时候形参不匹配就找不到函数了。(taichi函数支持同名不同参数的重载吗)

我是新人,不太清楚怎么把代码贴进来,还望大佬们多多指教!

这是一部分代码:
——time_iter.py
import taichi as ti
import math
#… #import all modules needed
import numpy as np
#… #初始化太极 ti.init()
from user_defined_functions import *
#…
#…
#get nodelist (例如nodelist = [0 0 0 0 0 ])
addBC_Forc_user(nodelist) #这里会报错
#…

——user_defined_functions.py
import data
import taichi as ti
import numpy as np
pf = data.pointField
#…
@ti.kernel
def addBC_Forc_user(nodelist:ti.types.ndarray()):
for i in nodelist:
pf[nodelist[i]].Forc += -pf[nodelist[i]].Disp * pf[nodelist[i]].Density*0.01

如果是ti.kernel的话,只会在调用的时候才触发编译,在import的时候应该至少是不会编译的。

如果希望我们来看一下具体问题的话,你需要贴一个最小复现代码,以及报错日志?

1 个赞