请问taichi是否能支持数据间有依赖的外层循环并行?

你好!

@ti.kernel
def type_count(types: ti.types.ndarray(), pos: ti.types.ndarray()):
    for i in range(pos.shape[0]):
        types[int(pos[i])] += 1

@ti.kernel
def type_err_count(err_count: ti.types.ndarray(), if_correct: ti.types.ndarray(), op_type: ti.types.ndarray()):
    for i in range(if_correct.shape[0]):
        if if_correct[i] == 0:
            err_count[int(op_type[i])] += 1

请问对于上面的两个kernel,taichi在cpu上是否能够保证正确执行?以第一个kernel为例,不同的i可能对应相同的pos[i],于是不同的线程会需要修改相同位置的数据。

我在cpu上使用taichi的时候多次运行可以得到相同的结果,但是在使用cuda的时候总会得到不同的结果。

Hi @qhz991029,欢迎来到Taichi Lang 论坛。

即使你使用CPU执行kernel函数,它也会多线程并行执行。如果你想要for循环串行之行,可以在for循环上面一行设置ti.loop_config(serialize =True),具体见文档:Performance Tuning | Taichi Docs

但是请问对于我贴的代码中的问题,taichi在处理的时候是否会通过加锁等方法来解决呢?

会的,+=atomic_add 一样,都是原子操作。

1 个赞