我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?
我已经阅读了Metcalf,Reid和Cohen的Fortran 95书以及Fortran 90中的Numerical Recipes.他们建议使用WHERE,FORALL和SPREAD以避免不必要的程序序列化.
但是,我偶然发现这个答案,声称FORALL在理论上很好,但在实践中毫无意义 - 你也可以编写循环,因为它们也可以并行化,你可以使用OpenMP(或某些编译器的自动功能)明确地将它们并行化.英特尔).
任何人都可以从经验中验证他们是否通常发现这些结构比显式循环和if并行性能方面的语句更具优势吗?
是否还有其他语言的并行功能,这些功能在原则上是好的但在实践中不值得?
我很欣赏这些问题的答案在某种程度上依赖于实现,因此我对gfortran,Intel CPU和SMP并行性最感兴趣.
我已经获得了一个2D矩阵,表示金属板表面的温度点.基质(板)的边缘保持恒定在20摄氏度,并且在一个预定点处存在100摄氏度的恒定热源.所有其他网格点最初设置为50摄氏度.
我的目标是通过对周围的四个网格点(i + 1,i-1,j + 1,j-1)进行迭代平均来获取所有内部网格点并计算其稳态温度,直到达到收敛(迭代之间小于0.02摄氏度).
据我所知,迭代网格点的顺序是无关紧要的.
对我来说,这听起来像是调用Fortran FORALL构造并探索并行化乐趣的好时机.
如何确保代码确实是并行化的?
例如,我可以在我的单核PowerBook G4上编译它,并且由于并行化,我预计速度不会提高.但如果我在双核AMD Opteron上编译,我会假设FORALL结构可以被利用.
或者,有没有办法衡量程序的有效并行化?
更新
回答MSB的问题,这是与gfortran版本4.4.0.gfortran是否支持自动多线程?
值得注意的是,FORALL结构已被淘汰,我想,那就是自动向量化.
也许这对于一个单独的问题是最好的,但自动矢量化是如何工作的?编译器是否能够检测到循环中只使用纯函数或子例程?