我在C99中实现了2D Ising模型的MC-Simulation 在Scientific Linux 6.5上使用gcc 4.8.2进行编译 当我按比例放大网格时,模拟时间会增加。 该实现仅使用Metropolis-Hastings算法。 我试图找到一种方法来加速算法,但我没有任何好主意? 有一些技巧吗?
答案 0 :(得分:3)
正如jimifiki所写,尝试进行分析会议 为了仅改进算法方面,您可以尝试以下方法:
<强>并行化:强>
如前所述,可以并行化算法。为了保持物理正确性,您必须使用所谓的棋盘格概念。将二维网格视为棋盘并且仅计算一次平行的白色单元,然后计算黑色单元格。这应该是清楚的,考虑到引入价值依赖关系的最近邻的相互作用。
使用GPGPU:
您还可以在GPGPU上实现模拟,例如使用CUDA,如果您已经在使用C99。
一些提示:
- 不要忘记正确对齐C99结构
- 使用线性数组,而不是嵌套数组。如果正确完成,对齐的内存通常会更快访问
- 尝试让编译器进行循环展开等(gcc特殊选项,而不是O2上的默认选项)
更多信息:
如果您寻找一种有效的方法来计算系统的临界点,那么选择的方法将是有限大小的缩放,您可以在不同的系统大小和不同的温度下进行模拟,然后计算系统大小的独立值。临界点,因此是相应曲线的交点(请参阅理论以获得详细的解释)
我希望我能提供帮助。 干杯...
答案 1 :(得分:1)
您的模拟时间至少与大小的平方成比例是正常的。不是吗?
这里有一些主题:
如果您担心热化问题,请尝试使用并行回火。它可以有所帮助。
Metropolis-Hastings算法可以并行。你可以尝试这样做。
检查您是否对代码感到悲观。
你的旋转阵列是什么?你可以把很多旋转放在同一个int上。这是一项很多工作。
此外,请记住唐纳德教给我们的东西:
premature optimisation is the root of all evil
在优化之前,您应该首先了解程序运行缓慢的地方。这称为分析。