import threading as td
import taichi as ti
@ti.data_oriented
class someclass(td.Thread):
def __init__(self):
td.Thread.__init__(self)
self.a = ti.field(float, shape=50)
self.b = [0 for i in range(50)]
def calltd(self):
threads = []
for i in range(50):
threads.append(td.Thread(target=self.tdworker, args=(i,)))
threads[-1].start()
for i in range(50):
threads[i].join()
def tdworker(self, i):
self.a[i] = i
self.b[i] = i
ti.init(arch=ti.cuda)
sc = someclass()
sc.calltd()
如代码所示,我使用threading模块来给一个field(也即self.a)变量赋值,但运行就会报错
RuntimeError: [taichi/rhi/cuda/cuda_driver.h:taichi::lang::CUDADriverFunction<void *>::operator ()@92] CUDA Error CUDA_ERROR_INVALID_CONTEXT: invalid device context while calling stream_synchronize (cuStreamSynchronize)
AssertionError: Slicing is not supported on ti.field
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: [llvm_context.cpp:taichi::lang::TaichiLLVMContext::add_struct_module@664] Assertion failure: std::this_thread::get_id() == main_thread_id_
但对于一般的列表变量赋值就没问题。