如何避免程序处于状态 D

How to avoid programs in status D

我写了一个程序是 reading/writing 数据(打开一个 infile 和一个 outfile,读取 infile 的一部分,然后处理,然后写入 outfile,然后循环重复),I/O总值约200M/s。但是,在运行的大部分时间里,他们都处于状态D,也就是等待I/O(如图)1。我在我的系统中使用 dd 检查写入速度,大约是 1.8G/s。

我的程序效率低下吗? 还是我的硬盘有问题? 我该如何处理?

如果使用 ifort,则必须明确使用缓冲 I/O。编译时用-assume buffered_io标记或在open语句中设置buffered='yes'

如果您使用的是 gfortran,这是默认设置,那么肯定还有其他问题。

编辑

我可以补充一点,根据您读取和写入数据的方式,大部分时间都可以花在解析上,即解码 ascii 字符 123 等并将基数从 10 更改为 2,直到它是机器可读数据;然后在写作时做相反的事情。如果您像这样构建代码,就会出现这种情况:

real :: vector1(10)

do
  read(5,*) vector1 !line has 10 values
  write(6,*) vector1
enddo

如果您改为执行以下操作,速度会快得多:

character(1000) :: line1 ! use enough characters so the whole line fits

do
  read(5,'(A)') line1 
  write(6,'(A)') line1
enddo

现在您只是通过程序输入 ascii,甚至不知道它的数字是“ääåö(=)&/&%/(¤%/&Rhgksbks---31)”。通过这些修改,我认为您应该达到磁盘速度的最大值。

另请注意,大多数驱动器中都有一个写入缓存,它比磁盘 read/write 速度更快,这意味着您可能首先会受到读取速度的限制,并且在填满写入缓存后,受写入速度限制,写入速度通常低于读取速度。