代码之家  ›  专栏  ›  技术社区  ›  EMiller

如何确保我的Fortran FORALL构造被并行化?

  •  5
  • EMiller  · 技术社区  · 14 年前

    我得到了一个二维矩阵,表示金属板表面的温度点。矩阵(板)的边缘保持恒定在20摄氏度,在一个预定义的点有100摄氏度的恒定热源。所有其他栅格点最初设置为50摄氏度。

    我的目标是取所有内部网格点,通过对周围四个网格点(i+1,i-1,j+1,j-1)进行迭代平均来计算其稳态温度,直到我达到收敛(迭代之间的变化小于0.02摄氏度)。

    FORALL 构建并探索并行化的乐趣。

    如何确保代码确实被并行化?

    例如,我可以在我的单核powerbookg4上编译它,我不希望由于并行化而在速度上有任何提高。但是如果我在双核amdopteron上编译,我会假设FORALL构造可以被利用。

    更新

    3 回复  |  直到 14 年前
        1
  •  6
  •   exfizik    14 年前

    如果使用“英特尔Fortran编译器”,则可以使用命令行开关打开/增加编译器的详细级别以进行并行化/矢量化。这样,在编译/链接过程中,您将看到如下内容:

    FORALL loop at line X in file Y has been vectorized
    

    我承认,我上次使用它已经有几年了,所以编译器消息实际上看起来可能非常不同,但这是基本的想法。

        2
  •  7
  •   Brian    14 年前

    FORALL是赋值构造,而不是循环构造。FORALL的语义表示,FORALL中每个赋值的右侧(RHS)表达式在被赋值到左侧(LHS)之前都会被完全求值。无论右驾驶室的操作有多复杂,包括右驾驶室和左驾驶室重叠的情况,都必须这样做。

    大多数编译器都致力于优化FORALL,这既是因为它很难优化,也是因为它不常用。最简单的实现是简单地为RHS分配一个临时变量,计算表达式并将其存储在临时变量中,然后将结果复制到LHS中。分配和取消分配这个临时文件可能会使您的代码运行非常缓慢。编译器很难在没有临时参数的情况下自动确定何时可以对RHS进行求值;大多数编译器都不会这样做。嵌套的DO循环更易于分析和优化。

    !$omp parallel workshare
    FORALL (i=,j=,...)
        <assignment>
    END FORALL
    !$omp end parallel
    

    gfortran-fopenmp blah.f90-o blah等等

    请注意,并行评估RHS不需要兼容的OpenMP实现(至少包括gfortran的旧版本);可以接受实现评估RHS,就像它包含在OpenMP“single”指令中一样。还要注意,“工作共享”可能不会消除RHS分配的临时资源。例如,MacOSX上的旧版本IBMFortran编译器就是这样。

        3
  •  3
  •   M. S. B.    14 年前

    最好的方法是测量计算的时钟时间。尝试使用和不使用并行代码。如果时钟时间减少,那么并行代码正在工作。在代码块前后调用的Fortran内部系统时钟将为您提供时钟时间。内在的cpu时间将为您提供cpu时间,当代码运行多线程时,由于开销,cpu时间可能会增加。

    Fortran编译器在实现真正的并行处理的能力上各不相同,而无需显式指定,例如使用OpenMP或MPI。你用的是什么编译器?