我是编程新手,我实际上是一名机械工程师。对于我的研究,我写了一个用于建模过程的fortran例程。 这个例程非常慢,因为要么是我编写的(因此它在计算上并不完美)并且它执行多次迭代以达到收敛,所以它需要时间。
但我有一个6核CPU,我想如果我可以利用所有核心,那么例程可以比现在运行得更快。
例程如下:
PROGRAM my routine
INCLUDE 'dimensions_of_arrays.dim'
INCLUDE 'subroutines.sub'
INCLUDE 'subroutines2.sub'
DECLARATION OF VARIABLES
..
.
DO LOOP OVER MANY STEPS
.
CALL MANY SUBROUTINES
.
.
.
PERFORM SOME ITERATION
END LOOP
.
WRITE RESULTS
END
在子程序的文件中,子程序.sub'我有20多个子程序,如下:
SUBROUTINE xxx(a,b)
INCLUDE 'dimensions_of_arrays.dim'
DECLARATION OF VARIABLES
COMMON/PATH1/PATH2/G,J,K
.
.
SOME CALCULATION
.
END
在文件' dimensions_of_arrays.dim'在编译期间使用了常用和参数。
您认为在此例程中使用多处理器是否可行?尽量不要修改它"严重"。
我使用英特尔Composer XE2011和Visual Studio 2010作为代码的编译器。
非常感谢任何帮助。 感谢
答案 0 :(得分:0)
由于您使用的是英特尔Fortran,我建议您的第一步应该是添加自动并行化选项。在Windows上的Visual Studio中,这是项目属性Fortran>优化>并行化>是。当你在这里时,我建议设置选项/ QxHost。我不记得你使用的旧版本是否支持将其作为项目属性 - 如果是的话,它将是Fortran>代码生成>特定于英特尔处理器的优化>与主机处理器相同。当然,您应该构建一个Release配置来启用优化。
这可能会给你足够的性能提升,令人满意。如果不是下一步,我建议打开优化诊断,看看为什么某些循环无法并行化。
您正在使用相当旧版本的编译器 - 较新版本在并行化和优化方面要好得多,我建议您使用您可以访问的最新版本。如果这些都没有产生你想要的结果,那么我同意你需要“弄脏你的手”#34;并添加OpenMP指令,但这需要您很好地理解程序的工作方式,应该共享哪些变量以及哪些变量是私有的。中间步骤是使用英特尔并行化指令,但这些指令与OpenMP没有太大区别。
将串行程序转换为并行时,尤其是旧的Fortran代码时,在全局变量(通常是COMMON)时必须非常小心。这些可以阻止并行化或导致错误的结果。英特尔Inspector XE工具(较大的英特尔Parallel Studio XE版本的一部分)可以很好地为您找到这些。