本帖最后由 愤怒的三炮 于 2024-10-10 20:39 编辑
平常在地震数据处理的时候,经常会把程序拆分成几个模块,第一个模块处理完,将数据通过管道传递给第二个模块接着处理。
开源的SU软件也是这么做的,但它是用C写的。我用Fortran自己实现了某些处理,然后也用管道的方式进行数据传递,发现intel fortran传递奇慢。
下面是一个小测试:
main1.f90
[Fortran] 纯文本查看 复制代码 integer,allocatable:: a(:,:,:)
allocate(a(100,1024,1024))
a = 1
print*, a
end
main2.f90
[Fortran] 纯文本查看 复制代码 integer,allocatable:: a(:,:,:)
allocate(a(100,1024,1024))
read*, a
print*, a(100,100,100)
end
[Bash shell] 纯文本查看 复制代码 ifort main1.f90 -o main1
ifort main2.f90 -o main2
./main1 | ./main2
400M的数据,gfortran只用了 10s 就传递完成了,且输出正确;但 intel fortran 却足足用了12分钟。
我想可能是跟 io buffering 有关,但我打开了 intel fortran 的 io buffer 选项后,依旧是如此。
请问这是什么原因呢?
ifort version 19.1.3.304
gcc version 7.5.0
Ubuntu 18.04
|