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 Like
哦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 Likes