Struc function get_ch_S0_to_S3 not found

大家好,我是taichi 新手,目前在用taichi完成一个项目,项目主程序 main.py 有调用一个子程序 powder_deposition.py里的一个自定义函数 powder_dem(),其简要代码如下。在单独运行powder_dem()时,没有任何错误,但在main.py里调用powder_dem()时却出现:

[E 03/16/24 17:03:13.489 22976] [codegen_llvm.cpp:taichi::lang::TaskCodeGenLLVM::get_struct_function@1669] Struct function get_ch_S0_to_S3 not found.
Process finished with exit code -1073740791 (0xC0000409),

代码直接停止。

请问这是什么问题呢? 多谢啦

主程序和子程序简要代码 如下:

main.py:

import os
import taichi as ti
from arguments import args
from powder_deposition import powder_dem

ti.init(arch=ti.gpu, default_fp=ti.f32, device_memory_GB=19)
os.makedirs(‘result’, exist_ok=True) # Make dir for output

def integrator():

dt_laser, dt_cfd_pfm = 2e-4, 2e-6
dt_powderdeposition = 1.
step_laser = args.laser_step
step_evol = int(dt_laser / dt_cfd_pfm)
args.time = 0.
powder_dem()

if name==“main”:
integrator()


powder_dem():

@ti.kernel
def init_r_size_grain_label():

for i in range(num_powder):
    pf[i].r_size = r_dmin + ti.floor(ti.random(float) * (powder_r_max - powder_r_min) / mesh_size, ti.int32)
    pf[i].grain_label = ti.ceil(ti.randn(ti.u32) % 20, int) + 1

def init():

init_r_size_grain_label()

args.Nz0 = args.Nz_old + tmp_Nz
args.Nz = args.Nz_old + tmp_Nz + 2 * r_dmax + interface_thick
args.domain_height = args.dxyz * args.Nz

args.eta = ti.field(dtype=ti.f32, shape=(args.Nx, args.Ny, args.Nz)) 
args.phi = ti.field(dtype=ti.f32, shape=(num_oris, args.Nx, args.Ny, args.Nz))

if args.time == 0:
    args.z_height = ti.field(dtype=ti.int32, shape=2)

else:
    eta_phi_add(args.eta, args.eta_old, args.phi, args.phi_old)

** return args.eta, args.phi**

def powder_dem():

eta, phi = init()
updata_eta_phi(eta, phi)
print('done')

debug时,发现问题语句是 init_r_size_grain_label() 这一句,里面 num_powder =4000, 其他field shape 常数分别为: num_oris = 20, args.Nx = 1002, args.Ny = 1002, args.Nz = 60

如果有大佬遇到并解决了这个问题,请不吝赐教。

多谢啦

版本信息如下: taichi=1.4.0, llvm=15.0.1, python=3.10.12, pycharm=2023.2.2

写了个一个很小的程序,相同的逻辑路线,运行结果如下,bug还是如此

你需要在func中再声明一下aa,似乎就可以运行了

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

aa = ti.field(float, shape = 15)

@ti.kernel
def ff():
    for i in ti.grouped(aa):
        aa[i] = 40

def func():
    aa = ti.field(float, shape = 15)
    ff()
    return aa.to_numpy()

多谢啦,用data_oriented 把问题解决了, :grin: