运行 具有多处理器的 fortran 例程
Run fortran routine with multi processor
我是编程新手,我实际上是一名机械工程师。为了我的研究,我编写了一个用于对流程建模的 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
在子程序的文件中'subroutines.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'中有编译时用到的common和参数
您认为在这个例程中使用多处理器是可能的吗?尽量不修改它 "heavily".
我使用带有 Visual Studio 2010 的 Intel Composer XE2011 作为代码的编译器。
非常感谢任何帮助。
谢谢
既然您使用的是 Intel Fortran,我建议您首先应该添加自动并行化选项。在 Windows 的 Visual Studio 中,这是项目 属性 Fortran > 优化 > 并行化 > 是。当您使用它时,我建议设置选项 /QxHost。我不记得您使用的旧版本是否支持将此作为项目 属性 - 如果支持,则为 Fortran > 代码生成 > 英特尔处理器特定优化 > 与主机处理器相同。当然,您应该构建发布配置以启用优化。
这可能会给您带来足够的性能提升,让您满意。如果不是,我建议的下一步是打开优化诊断并查看它对某些循环无法并行化的原因。
您使用的是相当旧版本的编译器 - 新版本在并行化和优化方面要好得多,我建议您使用您可以访问的最新版本。如果 none 产生了你想要的结果,那么我同意你需要 "get your hands dirty" 并添加 OpenMP 指令,但这需要你很好地理解程序的工作原理,哪些变量应该共享,哪些是私有的。一个中间步骤是使用 Intel 并行化指令,但这与 OpenMP 没有太大区别。
将串行程序转换为并行程序时,尤其是旧的 Fortran 代码,在涉及全局变量(通常是 COMMON)时必须非常小心。这些可能会阻止并行化或导致不正确的结果。英特尔 Inspector XE 工具(较大的英特尔 Parallel Studio XE 版本的一部分)可以很好地为您找到这些。
我是编程新手,我实际上是一名机械工程师。为了我的研究,我编写了一个用于对流程建模的 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
在子程序的文件中'subroutines.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'中有编译时用到的common和参数
您认为在这个例程中使用多处理器是可能的吗?尽量不修改它 "heavily".
我使用带有 Visual Studio 2010 的 Intel Composer XE2011 作为代码的编译器。
非常感谢任何帮助。 谢谢
既然您使用的是 Intel Fortran,我建议您首先应该添加自动并行化选项。在 Windows 的 Visual Studio 中,这是项目 属性 Fortran > 优化 > 并行化 > 是。当您使用它时,我建议设置选项 /QxHost。我不记得您使用的旧版本是否支持将此作为项目 属性 - 如果支持,则为 Fortran > 代码生成 > 英特尔处理器特定优化 > 与主机处理器相同。当然,您应该构建发布配置以启用优化。
这可能会给您带来足够的性能提升,让您满意。如果不是,我建议的下一步是打开优化诊断并查看它对某些循环无法并行化的原因。
您使用的是相当旧版本的编译器 - 新版本在并行化和优化方面要好得多,我建议您使用您可以访问的最新版本。如果 none 产生了你想要的结果,那么我同意你需要 "get your hands dirty" 并添加 OpenMP 指令,但这需要你很好地理解程序的工作原理,哪些变量应该共享,哪些是私有的。一个中间步骤是使用 Intel 并行化指令,但这与 OpenMP 没有太大区别。
将串行程序转换为并行程序时,尤其是旧的 Fortran 代码,在涉及全局变量(通常是 COMMON)时必须非常小心。这些可能会阻止并行化或导致不正确的结果。英特尔 Inspector XE 工具(较大的英特尔 Parallel Studio XE 版本的一部分)可以很好地为您找到这些。