【发布时间】:2011-04-08 13:15:55
【问题描述】:
我得到了一个代表金属板表面温度点的二维矩阵。矩阵(板)的边缘保持恒定在 20 摄氏度,并且在一个预定义的点有一个 100 摄氏度的恒定热源。所有其他网格点最初设置为 50 摄氏度。
我的目标是获取所有内部网格点并通过对周围四个网格点 (i+1, i-1, j+1, j-1) 进行迭代平均来计算其稳态温度,直到达到收敛 (迭代之间的变化小于 0.02 摄氏度)。
据我所知,我遍历网格点的顺序无关紧要。
对我来说,现在是调用 Fortran FORALL 构造并探索并行化乐趣的好时机。
如何确保代码确实被并行化了?
例如,我可以在我的单核 PowerBook G4 上编译它,我预计并行化不会提高速度。但是如果我在双核 AMD Opteron 上编译,我会假设 FORALL 结构可以被利用。
或者,有没有办法衡量程序的有效并行化程度?
更新
针对 M.S.B 的问题,这是 gfortran 版本 4.4.0。 gfortran 是否支持自动多线程?
值得注意的是,FORALL 构造已经过时了,我想,然后是自动矢量化。
也许这最适合单独的问题,但自动矢量化是如何工作的?编译器是否能够检测到循环中只使用了纯函数或子例程?
【问题讨论】:
-
通常“向量化”和“并行化”用于不同的优化。矢量化适用于诸如 SSE 到 SSE4 SIMD Intel 指令之类的指令,这些指令可以在单个处理器上并行执行少量操作。并行化导致在多个处理器或内核上运行的多线程代码,从两个到多个。对于自动向量化或并行化,编译器检查的代码有很多限制。使用 OpenMP,程序员必须确保不违反限制。
标签: parallel-processing fortran forall