我有一个fortran代码用于计算与我所做的工作相关的一些数量。代码本身涉及几个嵌套循环,并且需要很少的磁盘I/O。每当代码被修改时,我都会针对一组输入文件运行它(只是为了确保它正常工作)。为了长话短说,最近的更新将程序的运行时间增加了四倍,并且使用一个CPU连续运行每个输入文件需要大约45分钟(等待很长时间,只是为了看看是否有什么被打破)。因此,我想在系统上的4个cpus上并行运行每个输入文件。我一直试图通过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并行Shell吗?如果没有,请检查您的标签的描述,并仅使用适用的标签。另外,bash标签是否真的相关?一些代码可能是必要的。 –
是的,我尝试使用GNU并行作为解决方案。我也尝试过使用xargs,等待,并简单地在后台启动多个实例。 –
你有四个硬件核心吗?你的程序内存带宽很重吗?请提供有关您的硬件和示例程序的更多具体信息。 – IanH