求助,CPU可以跑,但是GPU跑不起来

大家好,我试了一天Bug,一直不知道问题在哪里。我把代码里出问题的Part摘出来,大家看一下。CPU 可以跑,GPU在某些数值可以跑,在某些数值不可以跑。我用的系统是win10 ,cpu-Intel® Xeon® W-2235 CPU ;GPU-NVIDIA Quadro P2200. 通过Spyder运行的。可能问题出在GPU上,但是我不知道怎么才能正常跑起来,因为我需要的参数刚好就是跑不起来的情况 :face_with_head_bandage:

代码如下:

import taichi as ti
import sys
ti.init(arch=ti.gpu)

@ti.data_oriented
class Test:   

    def __init__(self):
        self.RankingNumAll          = ti.field(ti.u32, shape=()) 
        self.RankingNumAll[None]    = 0  

        self.max_num_plumes         = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32)                                         
        self.R                      = ti.field(            dtype=ti.f32)
        self.Vel                    = ti.Vector.field(14, dtype=ti.f32) 
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num_plumes)
        self.plumelistA.place(self.Pos,self.R,self.Vel)   
        

    @ti.kernel
    def NewParticle(self):        
        AppendRow                           =  ti.length(self.plumelistA, [])
        for i in range(3):
            Row                             =  AppendRow + i
            self.Pos[Row]                   =  ti.Vector([0,0])  
            self.R[Row]                     =  0
            self.Vel[Row]                   =  ti.Vector([0,0,0,0,0,0,0,0,0,0,0,0,0,0]) 
        for i in range(3):
            Row                             =  AppendRow + i + 3
            x                               =  0 
            self.Pos[Row]                   =  ti.Vector([x,0]) 
            self.R[Row]                     =  0
            self.Vel[Row]                   =  ti.Vector([0,0,0,0,0,0,0,0,0,0,0,0,0,0])  
            
            
    @ti.kernel
    def Act(self):
        NUMBEROFPLUMES = ti.length(self.plumelistA, [])
        for AN in range(NUMBEROFPLUMES*NUMBEROFPLUMES):
            targetIDRow                     = ti.cast(ti.floor(AN/NUMBEROFPLUMES),ti.i32)
            ActionIDRow                     = ti.cast(AN - NUMBEROFPLUMES * targetIDRow,ti.i32)
            x0                              = self.Pos[targetIDRow][0]
            y0                              = self.Pos[targetIDRow][1]
            r0                              = self.R[targetIDRow]
            x1                              = self.Pos[ActionIDRow][0]
            y1                              = self.Pos[ActionIDRow][1]
            r1                              = self.R[ActionIDRow]
            dx                              = x1 - x0
            dy                              = y1 - y0 
            dist                            = ti.sqrt(dx*dx + dy*dy)/10000
            interactionLength               = 5*(r0 + r1)
            AvoidLength                     = 0.5*(r0 + r1) 

            if (AvoidLength < dist < interactionLength): 
                self.Vel[targetIDRow][2]   +=  1
                self.Vel[targetIDRow][3]   +=  1
            elif ((r0 + r1)/2 < dist <= AvoidLength):     
                self.Vel[targetIDRow][4]   +=  1
                self.Vel[targetIDRow][5]   +=  1  

                
    def Run(self): 
        stepall = 0 
        while stepall < 200:
            stepall += 1   
            self.NewParticle()  
            self.Act()
            

if __name__ == '__main__':
    Test().Run()

会跑一会然后出现如下错误:

RuntimeError: [taichi/backends/cuda/jit_cuda.h:taichi::lang::JITModuleCUDA::lookup_function@53] Cannot look up function NewParticle_c42_0_kernel_1_serial

但是这个代码,在CPU上可以跑,将初始化改为ti.init(arch=ti.cpu)就可以运行了。

那么在GPU下运行,我试了一下有两种情况下可以跑,初始化ti.init(arch=ti.gpu)
1)将dynamic节点的最大长度设置短一些,即将第12行self.max_num_plumes = 80的数值设置小一些,如self.max_num_plumes = 40 GPU下可以正常运行。
2)第12行self.max_num_plumes = 80的数值不变小,而将另外一个预设参数注释掉也可以运行,即将第10行self.RankingNumAll[None] = 0 注释掉,即:

import taichi as ti
import sys
ti.init(arch=ti.gpu)

@ti.data_oriented
class Test:   

    def __init__(self):
        self.RankingNumAll          = ti.field(ti.u32, shape=()) 
        #self.RankingNumAll[None]    = 0  

        self.max_num_plumes         = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32)                                         
        self.R                      = ti.field(            dtype=ti.f32)
        self.Vel                    = ti.Vector.field(14, dtype=ti.f32) 
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num_plumes)
        self.plumelistA.place(self.Pos,self.R,self.Vel)   

但是,我需要self.max_num_plumes = 400 同时self.RankingNumAll[None] = 0 这个参数在其他Part有用不能删除,然后GPU下运行,不知道怎么问题是啥,有好心人帮忙解答吗? :grinning:

1 个赞

Hi @MierDa, 我尝试运行了一下你提供的代码。我发现,GPU我也是可以运行的。

你能不能再简化一下代码,看一下具体哪里出错?

好的,你可以连续run几次看一下,我有时候run一次可以,再接着run一次就不行了。我先简化一下代码看看,寻找一下问题的关键在哪里。

禹老师,借楼请教个问题,关于ti.static(range(var))的。就是ti.static(range(9))可以运行,但是当这个9是通过ti.length(self.A, [])这样一个dynamic节点的长度得到的时候,ti.static(range(ti.length(self.A, [])))就提示不行,就像是python scope无法读取 ti.kernel中的变量一样,是个'Expr'。程序代码如下:

import taichi as ti

ti.init(arch=ti.gpu)

@ti.data_oriented
class Test: 
    def __init__(self):
        self.max_num                = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32) 
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num)
        self.plumelistA.place(self.Pos)   
        self.Pos[1]                   =  ti.Vector([0,0]) 

    @ti.kernel
    def Run(self):
        NUM = ti.length(self.plumelistA, [])
        for i in range(NUM):
            print('OK')
            
if __name__ == '__main__':
    Test().Run()

这样就没错,但是把循环用ti.static() unroll开就回出错,即for i in ti.static(range(NUM)):,完整代码如下:

import taichi as ti

ti.init(arch=ti.gpu)

@ti.data_oriented
class Test: 
    def __init__(self):
        self.max_num                = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32) 
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num)
        self.plumelistA.place(self.Pos)   
        self.Pos[1]                   =  ti.Vector([0,0]) 

    @ti.kernel
    def Run(self):
        NUM = ti.length(self.plumelistA, [])
        for i in ti.static(range(NUM)):
            print('OK')
            
if __name__ == '__main__':
    Test().Run()

就提示for循环无法识别range(NUM),出错如下TypeError: 'Expr' object cannot be interpreted as an integer,是不是要再range(NUM)这里加个什么修饰符,让kernel识别这个长度变量。

@YuPeng

这里要清楚ti.static是什么意思。这里推荐看一下太极图形课02讲:元编程:here:(22分:28秒)。

回到你的这个问题: NUM是一个运行时得到的数字,而ti.static需要编译时(比运行时更早)确定NUM的数字,所以就会出错。

1 个赞

@YuPeng 奥,这样子,明白了。
那就像我这里,在@ti.kenel中,for 循环的range是动态变化的,但是需要将循环串行,该怎么做呢,这个range的数值也是@ti.kenel中的变量。

我之前在课堂上看到,可以在外面套一个没有作用的循环,’for i in range(1):这样子,然后第二层循环就不会并行了,代码如下:

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

@ti.data_oriented
class Test: 
    def __init__(self):
        self.max_num                = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32) 
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num)
        self.plumelistA.place(self.Pos)   
        self.Pos[1]                   =  ti.Vector([0,0]) 

    @ti.kernel
    def Run(self):
        NUM = ti.length(self.plumelistA, [])
        for jj in range(1):
            for i in (range(NUM)):
                print('OK')
            
if __name__ == '__main__':
    Test().Run()

但是这样子会出错,RuntimeError: [offload.cpp:taichi::lang::irpass::`anonymous-namespace'::FixCrossOffloadReferences::visit_operand@562] SNodeOpStmt is not allowed here.

@YuPeng禹老师,感谢回答。我简化了一下代码,还是 无法运行,会跑一小会然后报错。我在Anaconda Powershell Prompt跑的。你再跑一下试试能不能成功运行,可以连续跑两遍试试。要是还可以运行,那就可能是我的电脑有问题。代码如下:

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

@ti.data_oriented
class Test:  
    def __init__(self):
        self.RankingNumAll          = ti.field(dtype=ti.u32, shape=()) 
        self.RankingNumAll[None]    = 0  
        #这里定义了一个AOS动态数组
        self.max_num                = 800
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32)                                         
        self.R                      = ti.field(            dtype=ti.f32)     
        self.list                   = ti.root.dynamic(ti.i,self.max_num)
        self.list.place(self.Pos,self.R)   
        
    @ti.kernel
    def NewParticle(self):
        #这里给动态数组不停的添加新的行
        AppendRow                           =  ti.length(self.list, [])
        for i in range(3):
            Row                             =  AppendRow + i
            self.Pos[Row]                   =  ti.Vector([0,0])  
            self.R[Row]                     =  1   
        #这里打印所有的行数 及其 列数   
        NUM                                 = ti.length(self.list, [])
        for AN in range(NUM*NUM):
            A                               = ti.cast(ti.floor(AN/NUM),ti.u32)
            B                               = ti.cast(AN - NUM * A    ,ti.u32)
            if (0 < self.R[B]):                
                print(NUM,A,B)   #print('AllRows-Cur_Row-Cur_Column')
                
    def Run(self): 
        for i in range(150):
            self.NewParticle()  

if __name__ == '__main__':
    Test().Run()

会出现如下错误:

[E 11/08/21 15:33:08.255 17940] [taichi/backends/cuda/cuda_driver.h:taichi::lang::CUDADriverFunction<void *>::operator ()@86] CUDA Error CUDA_ERROR_ILLEGAL_ADDRESS: an illegal memory access was encountered while calling stream_synchronize (cuStreamSynchronize)


e[38;2;255;000;255m***********************************
e[0me[38;2;255;000;255m* Taichi Compiler Stack Traceback *
e[0me[38;2;255;000;255m***********************************
e[0me[38;2;255;000;255m0x7ff96429c28a: e[0me[38;2;255;000;000mtaichi::print_tracebacke[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff96416b8e9: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964200353: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff9643d767e: e[0me[38;2;255;000;000mtaichi::print_tracebacke[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964239346: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964236f3c: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964233fdb: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff9640babb8: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff963ff4f4e: e[0me[38;2;255;000;000mpybind11::error_already_set::cleare[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff963ffcb52: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff96724dad9: e[0me[38;2;255;000;000mPySet_Containse[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672a0780: e[0me[38;2;255;000;000mPyDict_Cleare[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff96729ef78: e[0me[38;2;255;000;000mPyDict_MaybeUntracke[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672a0c41: e[0me[38;2;255;000;000mPyObject_GetDictPtre[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672e21b1: e[0me[38;2;255;000;000mPyGC_CollectNoFaile[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672e3c2f: e[0me[38;2;255;000;000mPyImport_Cleanupe[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672aa7d2: e[0me[38;2;255;000;000mPy_FinalizeExe[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672ab866: e[0me[38;2;255;000;000mPy_RunMaine[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672aa716: e[0me[38;2;255;000;000mPyArgv_AsWstrListe[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff967378fa5: e[0me[38;2;255;000;000mPy_Maine[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff75a441268: e[0me[38;2;255;000;000mUnknown Functione[0me[38;2;255;000;255m in python.exe
e[0me[38;2;255;000;255m0x7ff9aa7e7034: e[0me[38;2;255;000;000mBaseThreadInitThunke[0me[38;2;255;000;255m in KERNEL32.DLL
e[0me[38;2;255;000;255m0x7ff9aaf22651: e[0me[38;2;255;000;000mRtlUserThreadStarte[0me[38;2;255;000;255m in ntdll.dll
e[0me[38;2;255;165;000m
Internal error occurred. Check out this page for possible solutions:
https://docs.taichi.graphics/lang/articles/misc/install
e[0m[E 11/08/21 15:33:08.381 17940] Received signal 22 (SIGABRT)


e[38;2;255;000;255m***********************************
e[0me[38;2;255;000;255m* Taichi Compiler Stack Traceback *
e[0me[38;2;255;000;255m***********************************
e[0me[38;2;255;000;255m0x7ff96429c28a: e[0me[38;2;255;000;000m?print_traceback@taichi@@YAXXZe[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff96416b8e9: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964286438: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff9a8931881: e[0me[38;2;255;000;000mraisee[0me[38;2;255;000;255m in ucrtbase.dll
e[0me[38;2;255;000;255m0x7ff9a8932851: e[0me[38;2;255;000;000maborte[0me[38;2;255;000;255m in ucrtbase.dll
e[0me[38;2;255;000;255m0x7ff9a8931f9f: e[0me[38;2;255;000;000mterminatee[0me[38;2;255;000;255m in ucrtbase.dll
e[0me[38;2;255;000;255m0x7ff99c0c1aab: e[0me[38;2;255;000;000m__NLG_Return2e[0me[38;2;255;000;255m in VCRUNTIME140_1.dll
e[0me[38;2;255;000;255m0x7ff99c0c2317: e[0me[38;2;255;000;000m__NLG_Return2e[0me[38;2;255;000;255m in VCRUNTIME140_1.dll
e[0me[38;2;255;000;255m0x7ff99c0c40d9: e[0me[38;2;255;000;000m__CxxFrameHandler4e[0me[38;2;255;000;255m in VCRUNTIME140_1.dll
e[0me[38;2;255;000;255m0x7ff9aaf720cf: e[0me[38;2;255;000;000m__chkstke[0me[38;2;255;000;255m in ntdll.dll
e[0me[38;2;255;000;255m0x7ff9aaf21454: e[0me[38;2;255;000;000mRtlRaiseExceptione[0me[38;2;255;000;255m in ntdll.dll
e[0me[38;2;255;000;255m0x7ff9aaf211a5: e[0me[38;2;255;000;000mRtlRaiseExceptione[0me[38;2;255;000;255m in ntdll.dll
e[0me[38;2;255;000;255m0x7ff9a89f4f99: e[0me[38;2;255;000;000mRaiseExceptione[0me[38;2;255;000;255m in KERNELBASE.dll
e[0me[38;2;255;000;255m0x7ff9a412486d: e[0me[38;2;255;000;000m_CxxThrowExceptione[0me[38;2;255;000;255m in VCRUNTIME140.dll
e[0me[38;2;255;000;255m0x7ff96416b930: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964200353: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff9643d767e: e[0me[38;2;255;000;000m?print_traceback@taichi@@YAXXZe[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964239346: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964236f3c: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff964233fdb: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff9640babb8: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff963ff4f4e: e[0me[38;2;255;000;000m?clear@error_already_set@pybind11@@QEAAXXZe[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff963ffcb52: e[0me[38;2;255;000;000mPyInit_taichi_coree[0me[38;2;255;000;255m in taichi_core.pyd
e[0me[38;2;255;000;255m0x7ff96724dad9: e[0me[38;2;255;000;000mPySet_Containse[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672a0780: e[0me[38;2;255;000;000mPyDict_Cleare[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff96729ef78: e[0me[38;2;255;000;000m_PyDict_MaybeUntracke[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672a0c41: e[0me[38;2;255;000;000m_PyObject_GetDictPtre[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672e21b1: e[0me[38;2;255;000;000m_PyGC_CollectNoFaile[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672e3c2f: e[0me[38;2;255;000;000mPyImport_Cleanupe[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672aa7d2: e[0me[38;2;255;000;000mPy_FinalizeExe[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672ab866: e[0me[38;2;255;000;000mPy_RunMaine[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff9672aa716: e[0me[38;2;255;000;000m_PyArgv_AsWstrListe[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff967378fa5: e[0me[38;2;255;000;000mPy_Maine[0me[38;2;255;000;255m in python38.dll
e[0me[38;2;255;000;255m0x7ff75a441268: e[0me[38;2;255;000;000mUnknown Functione[0me[38;2;255;000;255m in python.exe
e[0me[38;2;255;000;255m0x7ff9aa7e7034: e[0me[38;2;255;000;000mBaseThreadInitThunke[0me[38;2;255;000;255m in KERNEL32.DLL
e[0me[38;2;255;000;255m0x7ff9aaf22651: e[0me[38;2;255;000;000mRtlUserThreadStarte[0me[38;2;255;000;255m in ntdll.dll
e[0me[38;2;255;165;000m
Internal error occurred. Check out this page for possible solutions:
https://docs.taichi.graphics/lang/articles/misc/install
e[0m

你还可以继续精简代码吗?先把不会报错的部分删掉,然后只保留会报错的位置?

我和同事都无法复现你的问题。

BTW:你可以在GPU上跑其他的Taichi程序么?

至于你想让kernel中的for循环串行,可以加一个if语句:

import taichi as ti
ti.init(arch=ti.gpu, dynamic_index=True)

@ti.data_oriented
class Test: 
    def __init__(self):
        self.max_num                = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32) 
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num)
        self.plumelistA.place(self.Pos)   
        self.Pos[1]                   =  ti.Vector([0,0]) 

    @ti.kernel
    def Run(self):
        NUM = ti.length(self.plumelistA, [])
        if True: #将for循环改成if语句。 Update: 这一句会被编译器自动优化掉,无法实现串行的效果。
            for i in (range(NUM)):
                print('OK')
            
if __name__ == '__main__':
    Test().Run()

好的 :hugs: :

我的电脑可以在GPU跑其他程序,可能是我的电脑有点问题。我换了个思路实现了我的需求,稍微绕了一下,不过不报错了。 :sunglasses: :嗯,我准备先这样。

if True 似乎会被优化掉

import taichi as ti

ti.init(arch=ti.gpu)

@ti.kernel
def foo():
    if True:
        for i in range(50):
            print(i)

    for _ in range(1):
        for i in range(51, 100):
            print(i)

foo()

在我这只有 51-100 是有序的。

2 个赞
if True:

会被太极编译器自动优化掉。如果想强制串行执行,可以使用:

for _ in range(1):

来代替。

这个用法确实有些hacky… 我们也许会考虑加入新的decorator来强制串行某个for循环。

2 个赞
import taichi as ti
ti.init(arch=ti.gpu)

@ti.data_oriented
class Test: 
    def __init__(self):
        self.max_num                = 80
        self.Pos                    = ti.Vector.field(2,   dtype=ti.f32) # 可以改成 ti.field(ti.i32),注意datatype是ti.i32
        self.plumelistA             = ti.root.dynamic(ti.i,self.max_num)
        self.plumelistA.place(self.Pos)   # `dynamic` node 暂时还不支持place `ti.Vector`
        self.Pos[1]                   =  ti.Vector([0,0])  # 需要使用ti.append函数

    @ti.kernel
    def Run(self):
        NUM = ti.length(self.plumelistA, [])
        for jj in range(1):
            for i in (range(NUM)):
                print('OK')
            
if __name__ == '__main__':
    Test().Run()

你之前提供的代码可以简化成这个Issue,已经在这个PR中解决了。

除此之外,你的程序还有多处Taichi不支持的地方会导致错误。

  1. dynamic node 暂时还不支持place ti.Vector
  2. ti.append 只能处理 ti.i32 格式的数据,可以看这里的Issue
1 个赞

好的,谢谢禹老师提示。不过dynamic place ti.Vector跑成功了,可能里面的数据会计算有问题,我检查一下改一下code。 论坛偶尔出这种saving的错误,看起来不知道回复成功了没有,我这里刷新没有,我重新回复的。