关于AoS和SoA的问题

请教一个问题,请问在mpm的GIMP或者APIC算法中,是不是将颗粒携带的信息利用AoS储存计算速度会更快,例如:

ti.root.pointer(ti.i, MaxparticleNum).place(self.material, self.body, self.x, self.v, self.gradv, self.td, self.m, self.vol, self.vol0 .........)

感谢!

Hi @Otis, 既然你已经定义好了数据结构。你可以测试一下性能做一下对比。taichi的一个方便的地方就是你的计算代码和数据结构可以解藕。

也欢迎你能把自己对性能的分析结果贴到论坛上来。

为什么稀疏矩阵写入数据的时候,速度比dense慢很多,感觉在mpm里用稀疏矩阵反而速度变慢了
测试代码:

import taichi as ti
import time
ti.init()

x = ti.field(ti.f32)
block = ti.root.bitmasked(ti.i, 1000)
block.place(x)

@ti.kernel
def loops():
for i in range(8):
# ti.append(x.parent(), i, i)
x[i] = i

s = time.time()
loops()
e = time.time()
print(e - s)

其中pointer->0.2105s
dense->0.0811s
dynamic->0.2379s
bitmasked->0.1005s
4核CPU

Hi @Otis , 使用 pointer, bitmasked等稀疏数据结构(空间稀疏)和稀疏矩阵还不是一回事儿。

还有在测试性能的时候,还需要考虑编译时间。一般测试性能会先跑一下kernel, 再测试性能。

loops()
s = time.time()
loops()
e = time.time()
print(e - s)

先编译后我又重新测试了一次速度,发现稀疏数据结构还是会比dense结构慢一倍左右