1. 引言
Itasca软件没有使用GPU运算,只是引入了多线程,当前版本的FLAC2D、FLAC3D、UDEC、3DEC 和 PFC 都是多线程的。理论上,通过使用list, splitting和operators,任何list(zones, gridpoints等)的循环被split成不同的块,然后把它分配到计算机上所有可得到的处理器来并行运算,从而增加整体的运行速度。
不过,实际的情况并非如此。Itasca承认在多 CPU 计算机上运行时,无论每个 CPU 的核心数量如何,多线程效率都会持续降低。因此并行运行两个FLAC3D 模型而不是串联运行两个模型能够提高整体效率。
2. 解决方法
Itasca发现即使没有使用所有的RAM,但当 RAM 插槽为空时计算机运行速度会变慢,因此Itasca建议填满所有 RAM 插槽。当我们说RAM插槽已满时,意味着主板上的所有内存插槽都被RAM模块占用了。通常主板共有 4 个 RAM 插槽,如果是双通道,则有两对。一些高端主板可能包含多达 8 个插槽,而在超级计算机中,每个系统可能有多个主板,总共最多 32 个插槽。
当一个计算在多个CPU或内核上并行执行时,特定计算产生的顺序会发生变化, 这可能会导致舍入误差以不同的方式累积起来。对于许多模型来说,几乎不可能检测到这些差异导致的最终结果。但对于一些广泛的模型来说,这些差异可能会被放大,导致每次运行给定模型时会得到不同的结果。需要注意的是,所有这些结果都是同样有效的,因为它们都在有限精度浮点误差范围内。
确定性模式(Deterministic mode)牺牲了效率和内存,在确定性模式下,不管它是在多少个CPU上进行的,也不管它们的相对速度如何, 所有以相同初始条件开始的模型每次运行都会产生相同的结果,但性能会降低至少20%。另一方面,在非确定性模式下,相同的初始条件可能导致不同的解答。其差异仅仅是由于求和顺序造成的,所有的解决方案在机器精度上都是同样有效的。
关闭determinism(命令为 model deterministic off)的对整个程序的运行会产生影响, 具体表现在以下几个方面: (1) 模型运行速度更快。在FLAC3D中可以快20%,在PFC3D中可以快70%。(2) 运行结果不可重复。在某些情况下,小的变化会传播,导致每次运行模型都会得到不同的结果。(3) 显然, 数据文件和项目文件不能重现结果。为了保存文档,应该将结果保存文件(.sav)与输入数据一起保存。
老的版本使用SET Deterministic on/off 命令, 新版本现在统一使用model deterministic <default> on/off 命令设置确定性模式。无论什么时候使用model new命令, 确定性模式会被重置为默认设置。可选的default关键字用于将默认设置设置为on/off,当不使用default时,则设置为当前的确定性模式。
4. FISH和Python执行命令
(1) FISH
在FISH内使用global.deterministic来获取/设置确定性模式:
获取: [deterministic_status = global.deterministic]
设置: [global.deterministic = True]
(2) Python
获取: deterministic_status = itasca.deterministic()
设置: itasca.set_deterministic(True)
import itasca as it
it.command("python-reset-state false")
import multiprocessing
max_threads = multiprocessing.cpu_count()
deterministic_status = it.set_deterministic(False)