我在用mpm计算一种弹塑性材料的初始地应力平衡,预先给定了颗粒内部的初始应力与外力场,然而用cpu计算时能立刻平衡,但是用gpu计算时,经过一定的计算时间,网格上的数值会累积出一定的误差,使得颗粒内部的应力计算错误。在这个算例中用的都是双精度。
cpu计算结果(地应力已平衡):
gpu计算结果(应力错误):
由于代码比较长,无法提供一个比较小的复现版本,请问一般有什么方法来解决类似的问题呢?
我在用mpm计算一种弹塑性材料的初始地应力平衡,预先给定了颗粒内部的初始应力与外力场,然而用cpu计算时能立刻平衡,但是用gpu计算时,经过一定的计算时间,网格上的数值会累积出一定的误差,使得颗粒内部的应力计算错误。在这个算例中用的都是双精度。
cpu计算结果(地应力已平衡):
gpu计算结果(应力错误):
由于代码比较长,无法提供一个比较小的复现版本,请问一般有什么方法来解决类似的问题呢?
MPM 中包含了方程求解的步骤的话,可能把方程求解的部分隔离开来比较一下结果,我看这图是求解有点发散的感觉。。?
看起来有可能是并行写的有点问题?cpu并行度不高可能不明显
好的谢谢包老师!
确实是并行的问题, 谢谢!
请问这种误差是正常的嘛
import taichi as ti
ti.init(arch=ti.gpu, default_fp=ti.f64)
a = ti.Vector([24.2, 24.2, 24.2])
b = ti.Vector([0.1, 0.1, 0.1])
print(a/b)
# output ====> [241.999997, 241.999997, 241.999997]
print(a*(1/b))
# output ====> [242, 242, 242]
感觉误差太大了
hello,我们测试的结果没有出现这个问题。你可以试试使用最近的 taichi 版本么?如果仍然出现这个问题的话,可以贴上你的机器和环境信息?
请问具体是什么并行问题呢?
这是浮点数计算的问题,你用python自带的浮点数计算也是一样的结果。