如何让kernel中的并行不反复擦写某个值?

from taichi.math import *
import taichi as ti
import numpy as np
ti.init(arch=ti.gpu)
index_ti_1 = ti.field(ti.i32,1)
array_ti_1 = ti.field(ti.i32,10)
index_ti_1[0] = 0
index_ti_2 = ti.field(ti.i32,1)
array_ti_2 = ti.field(ti.i32,10)
index_ti_2[0] = 0
@ti.kernel
def fill_ti_1():
    for i in range(10):
        array_ti_1[index_ti_1[0]] = i
        index_ti_1[0] +=1
@ti.kernel
def fill_ti_2():
    for i in ti.static(range(10)):
        array_ti_2[index_ti_2[0]] = i
        index_ti_2[0] +=1
fill_ti_1()
print(array_ti_1)
fill_ti_2()
print(array_ti_2)

对fill_ti_2()来说,将for改为串行执行,得到结果[0 1 2 3 4 5 6 7 8 9],但是对于fill_ti_1()来说,将会在index_ti_1[0]+=1还未执行完的时候使用可能使用八个线程并行执行,所以得到结果[8 0 0 0 0 0 0 0 0 0]

如何能在并行时向field里添加新值而不会覆盖掉旧值?不要求数据的顺序,得到结果可以是[5 8 3 2 0 9 1 7 4 6]这种?

一个简单的想法:可以用这样的 kernel 吗?

@ti.kernel                                                                                                                        
def fill_ti_3():                                                                                                                  
    for i in range(10):                                                                                                           
        array_ti_1[i] = i
1 个赞

哦sry,例子举的有一点点问题,实际上索引和值之间没有关系。我想要的算法思路是

data_field数据容器
for (在另一个遍历搜索中);
        if (x满足条件):#但不知道x的数量
               把x添加到data_field中

实际上就是对field的一个push操作,不知道怎么写

用ti.atomic_add可以实现push_back。

from taichi.math import *
import taichi as ti
import numpy as np
ti.init(arch=ti.gpu)
index_ti_1 = ti.field(ti.i32,1)
array_ti_1 = ti.field(ti.i32,10)
index_ti_1[0] = 0
index_ti_2 = ti.field(ti.i32,1)
array_ti_2 = ti.field(ti.i32,10)
index_ti_2[0] = 0
@ti.kernel
def fill_ti_1():
    for i in range(10):
        array_ti_1[ti.atomic_add(index_ti_1[0], 1)] = i
@ti.kernel
def fill_ti_2():
    for i in ti.static(range(10)):
        array_ti_2[ti.atomic_add(index_ti_2[0], 1)] = i
fill_ti_1()
print(array_ti_1)
fill_ti_2()
print(array_ti_2)

类似的问题:taichi如何实现cub::Flagged - #5,来自 archibate

3 个赞

问题已解决,感谢! :partying_face: