正在进行二维优化

时间:2014-04-17 14:40:10

标签: performance algorithm math simulation c99

我在C99中实现了2D Ising模型的MC-Simulation 在Scientific Linux 6.5上使用gcc 4.8.2进行编译 当我按比例放大网格时,模拟时间会增加。 该实现仅使用Metropolis-Hastings算法。 我试图找到一种方法来加速算法,但我没有任何好主意? 有一些技巧吗?

2 个答案:

答案 0 :(得分:3)

正如jimifiki所写,尝试进行分析会议 为了仅改进算法方面,您可以尝试以下方法:

  • 查找表:
    在计算Metropolis标准的能量差时,您需要评估指数exp [-K / T * dE],其中K是您的缩放常数(以Boltzmann常数为单位),dE是原始的能量差旋转后的状态和旋转状态 计算指数是昂贵的 因此,您只需预先构建一个表,在哪里查找dE的可能值。将有(四个选择一个加四个选择两个加四个选择三个加四个选择四个)可能的组合用于最近的邻近交互,利用问题的对称性,你得到五个值forEE:8,4,0, -4,-8。而不是使用exp函数,使用预先计算的表。
  • <强>并行化:
    如前所述,可以并行化算法。为了保持物理正确性,您必须使用所谓的棋盘格概念。将二维网格视为棋盘并且仅计算一次平行的白色单元,然后计算黑色单元格。这应该是清楚的,考虑到引入价值依赖关系的最近邻的相互作用。

  • 使用GPGPU:
    您还可以在GPGPU上实现模拟,例如使用CUDA,如果您已经在使用C99。

一些提示:
- 不要忘记正确对齐C99结构 - 使用线性数组,而不是嵌套数组。如果正确完成,对齐的内存通常会更快访问 - 尝试让编译器进行循环展开等(gcc特殊选项,而不是O2上的默认选项)

更多信息:
如果您寻找一种有效的方法来计算系统的临界点,那么选择的方法将是有限大小的缩放,您可以在不同的系统大小和不同的温度下进行模拟,然后计算系统大小的独立值。临界点,因此是相应曲线的交点(请参阅理论以获得详细的解释)

我希望我能提供帮助。 干杯...

答案 1 :(得分:1)

您的模拟时间至少与大小的平方成比例是正常的。不是吗?

这里有一些主题:

如果您担心热化问题,请尝试使用并行回火。它可以有所帮助。

Metropolis-Hastings算法可以并行。你可以尝试这样做。

检查您是否对代码感到悲观。

你的旋转阵列是什么?你可以把很多旋转放在同一个int上。这是一项很多工作。

此外,请记住唐纳德教给我们的东西:

premature optimisation is the root of all evil 

在优化之前,您应该首先了解程序运行缓慢的地方。这称为分析。