【问题标题】:Ising 2D OptimizationIsing 2D 优化
【发布时间】:2014-06-01 21:45:55
【问题描述】:

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

【问题讨论】:

  • 您应该首先了解您的程序慢的地方。这称为剖析。您还应该测量模拟时间如何随大小变化。
  • @jimifiki 你应该在你的答案中添加关于分析的部分,这很重要。

标签: performance algorithm math simulation c99


【解决方案1】:

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

这里有一些主题:

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

Metropolis-Hastings 算法可以并行化。你可以试着去做。

检查您没有对代码感到悲观。

你的自旋数组是整数吗?您可以在同一个 int 上进行多次旋转。这是很多工作。

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

premature optimisation is the root of all evil 

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

【讨论】:

    【解决方案2】:

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

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

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

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

    更多信息:
    如果您寻找一种有效的方法来计算系统的临界点,则选择的方法是有限尺寸缩放,您可以在不同的系统尺寸和不同的温度下进行模拟,然后计算一个与系统尺寸无关的值临界点,因此是相应曲线的交点(请参见理论以获得详细解释)

    希望我对您有所帮助。 干杯...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      相关资源
      最近更新 更多