愤怒的三炮 发表于 2024-10-10 20:32:19

intel fortran管道传输问题

本帖最后由 愤怒的三炮 于 2024-10-10 20:39 编辑

平常在地震数据处理的时候,经常会把程序拆分成几个模块,第一个模块处理完,将数据通过管道传递给第二个模块接着处理。

开源的SU软件也是这么做的,但它是用C写的。我用Fortran自己实现了某些处理,然后也用管道的方式进行数据传递,发现intel fortran传递奇慢。

下面是一个小测试:
main1.f90
integer,allocatable:: a(:,:,:)
allocate(a(100,1024,1024))
a = 1
print*, a
end
main2.f90
integer,allocatable:: a(:,:,:)
allocate(a(100,1024,1024))
read*, a
print*, a(100,100,100)
end

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

li913 发表于 2024-10-11 11:48:18

这个问题可能没法解决,编译器的事情。可以重定向到文件,而不是用管道,我在wsl测试了,gf 用时20s,ifort用时30s。

愤怒的三炮 发表于 2024-10-11 14:52:58

li913 发表于 2024-10-11 11:48
这个问题可能没法解决,编译器的事情。可以重定向到文件,而不是用管道,我在wsl测试了,gf 用时20s,ifort ...

我确实没注意到是编译器版本的问题,因为我之前用了intel parallel studio 2020和最新版的Oneapi,在WSL2、Ubuntu18.04和Ubuntu22.04上都试了一下,只在Ubuntu 18.04的测试中计时了,其它的都没等到它执行结束(但intel肯定都是超过五分钟的)。

愤怒的三炮 发表于 2024-10-12 10:38:43

如果有人出现了类似的问题,欢迎讨论。
页: [1]
查看完整版本: intel fortran管道传输问题