gpt4 book ai didi

fortran - 如何在 FORTRAN 中更快地写入二进制文件?

转载 作者:行者123 更新时间:2023-12-02 10:27:18 26 4
gpt4 key购买 nike

我有以下用于写入二进制文件的代码:

CALL system_clock(Time1, rate)
OPEN( 1, FILE='Test.bin', STATUS='UNKNOWN', ACCESS='STREAM')

DO 275 I=1,NDOF
DO 274 J=1,UBW
IF (S(I,J).NE.0) THEN
WRITE (1) I
WRITE (1) J+I-1
WRITE (1) (S(I,J))
ENDIF
274 CONTINUE
275 CONTINUE

CLOSE(1)
CALL system_clock(Time2)
print *, "elapsed time: ", real(Time2-Time1) / real(rate)

我知道通过使用更少的 WRITE 语句可以使其更快。因此,在循环内我使用以下代码,它更快:

IF (S(I,J).NE.0) THEN 
WRITE (1) I, J+I-1, (S(I,J))
ENDIF

有没有办法摆脱循环(因为它很耗时)或进行任何其他更改以获得更高效的代码?

请注意,我希望在我的写作中具有 I、J+I-1 和 S(I,J)(仅非零值)的顺序。另外,由于我使用 C++ 程序来读取二进制文件,因此我必须使用流访问。

非常感谢任何建议。

最佳答案

您可以做的一件事是翻转数组的处理顺序。因此,在 do 语句中只需将 i 与 j 切换即可。这是因为数组 S(i,j) 是二维的,它在内存中的存储方式对于访问速度非常重要。存储取决于所使用的编程语言标准,Fortran(与 C 相对,但与 Matlab 类似)使用列主形式的数组存储。因此访问内存最有效的方法就是从第一行的元素开始依次遍历数组的每一列。

关于fortran - 如何在 FORTRAN 中更快地写入二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15961060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com