我写了一个正在读/写数据的程序(打开一个infile和一个outfile,读取infile的一部分,然后进程,然后写入outfile,然后重复该循环),I / O值大约为200M / s in总。但是,大多数运行时,它们处于状态D,这意味着等待I / O(如图所示)1。我在我的系统中使用dd
检查写入速度,大约是1.8G / s。
我的节目效率低下吗? 或者我的硬盘有问题吗? 我该如何处理?
答案 0 :(得分:0)
如果使用ifort,则必须明确使用缓冲I / O.在-assume buffered_io
语句中编译或设置buffered='yes'
时标记为open
。
如果您使用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”。我认为这些修改你应该达到你的磁盘速度的最大值。
另请注意,大多数驱动器中都有写入缓存,这比磁盘读/写速度快,这意味着您可能首先受到读取速度的限制,并且在填充写入缓存之后,将受到限制。写入速度,通常低于读取速度。