【发布时间】:2016-11-22 22:47:32
【问题描述】:
我有一个 fortran 代码,用于计算与我所做的工作相关的一些数量。代码本身涉及多个嵌套循环,并且需要很少的磁盘 I/O。每当修改代码时,我都会针对一组几个输入文件运行它(只是为了确保它正常工作)。
长话短说,最近的更新将程序的运行时间增加了大约四倍,而用一个 CPU 串行运行每个输入文件大约需要 45 分钟(等待的时间很长,只是看看有没有坏掉的东西)。因此,我想在系统上的 4 个 CPU 上并行运行每个输入文件。我一直在尝试通过 bash 脚本实现并行性。
我注意到的有趣的事情是,当机器上只有一个程序实例正在运行时,它需要大约三分半钟才能完成一个输入文件。当程序的四个实例正在运行时,通过一个输入文件需要大约 11 分钟半的时间(使我的总运行时间从大约 45 分钟减少到 36 分钟 - 是的,这是一个改进,但不是我所拥有的希望)。
我尝试过使用 gnu parallel、xargs、wait 甚至只是从命令行在后台启动程序的四个实例来实现并行性。无论实例是如何启动的,我都看到同样的速度变慢。因此,我很确定这不是 shell 脚本的产物,而是程序本身发生的事情。
我尝试在关闭调试符号的情况下重建程序,并使用静态链接。这些都没有任何明显的影响。我目前正在使用以下选项构建程序:
$ gfortran -Wall -g -O3 -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow,denormal -fbounds-check -finit-real=nan -finit-integer=nan -o [程序名] {来源}
任何帮助或指导将不胜感激!
【问题讨论】:
-
您确定您使用的是 GNU Parallel Shell 吗?如果不是,请检查标签的描述并仅使用适用的那些。另外,bash 标签真的相关吗?可能需要一些代码。
-
是的,我尝试使用 GNU 并行作为解决方案。我也尝试过使用 xargs,等待,然后简单地在后台启动多个实例。
-
你有四个硬件核心吗?您的程序内存带宽重吗?请提供有关您的硬件和示例程序的更具体信息。
-
您的程序可能不受 CPU 限制,但受内存带宽限制或可能依赖某些共享资源,即 NFS 可能正在序列化文件访问。你有什么样的 CPU?
-
CPU 是 Intel i5-6500,四核 @ 3.2 GHz。我只是在单个 CPU 上运行,所以 NFS 不应该干扰。内存带宽是有意义的,这可能是瓶颈所在。
标签: bash parallel-processing fortran gfortran gnu-parallel