import taichi as ti
import time
ti.init()
a = ti.field(float)
b = ti.field(float)
ti.root.pointer(ti.i, 1000000).place(a)
ti.root.dense(ti.i, 1000000).place(b)
@ti.kernel
def k(x: ti.template()):
for i in x:
x[i] = i
k(a)
k(b)
start = time.time()
k(a)
end1 = time.time()
k(b)
end2 = time.time()
print(end1-start, end2-end1)
Hi @Otis. 你这段代码测的东西有一点小问题~
在 Taichi 中,for i in x 只会访问 x 中被激活的元素。因此,你调用 k(a) 时实际上没有进行任何访问。也就是说,你这里比较的是调用 k(a) 时产生的针对稀疏数据结构的额外开销,以及 k(b) 的访问时间。如果你把这段代码稍微改一下:
@ti.kernel
def k(x: ti.template()):
for i in x:
for j in range(10000):
x[i] = i
你会发现 k(b) 的时间明显变长了,而 k(a) 依然不变。
如果希望进行公平的比较,可以把 a 预先激活:
@ti.kernel
def init():
for i in range(1000000):
a[i] = i