如何避免程序处于状态 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 速度更快,这意味着您可能首先会受到读取速度的限制,并且在填满写入缓存后,受写入速度限制,写入速度通常低于读取速度。
我写了一个程序是 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 速度更快,这意味着您可能首先会受到读取速度的限制,并且在填满写入缓存后,受写入速度限制,写入速度通常低于读取速度。