2016-08-02 16 views
0

I/Oを使用して、データの読み取り/書き込み(1つのinfileと1つのoutfileのオープン、infileの部分の読み取り、次にprocess、次にoutfileへの書き込み) O値は約200M/sです。しかし、実行時間のほとんどは、ステータスDにあります。これは、I/Oを待つことを意味します(図のように)1。私はdd私のシステムでは、約1.8G/sのチェック書き込み速度を使用しました。ステータスのプログラムを回避する方法

enter image description here

私のプログラムでは、非効率的ですか? または私のハードディスクに問題がありますか? どうすれば対処できますか?

+3

ディスクの読み取りと書き込みのパフォーマンスを適切にテストするまでは、ディスクのパフォーマンスを推測するための基礎がありません。 「適切なテスト」とは、よく確立されたものの1つを実行することを意味し、インターネット上で簡単に見つけることができ、その目的のために利用可能なベンチマークです。もちろん、あなたのプログラムが非効率であるという結論を導き出すことはできません。ディスクの(理論的な)最大転送速度を達成するには十分なI/Oがないだけかもしれません。または、読み書きの混在により、最大転送速度に近くなることがあります。 –

+0

何をしているのか、何をしていないのかについての指標を得る方法が必要です。 これは、コード内のデバッグ行、Intelインスペクタなどのようなものです。 したがって、I/Oタイマーを使用してタイマーを計算することができます。 小さなブロックを書き込んだり読んだりすると、物事を遅くするのに十分なプロセスを得ている。 1つのスレッドからすべてのI/Oを実行し、ノード全体に作業を分散させることは珍しいことではありません。 問題を解決するには、1スレッドまたは2スレッドで小さな問題を解決する必要があります。私は競合状態を疑う...またはファイルが正しく閉じる/フラッシュされていない。 – Holmz

答えて

0

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 

今、あなたはちょうどさえせずにプログラムを通じてアスキーをポンピングしています多分「ääåö(=)&/&%/(¤%/ & Rhgksbks --- 31」。これらの変更で、私はあなたのディスク速度の最大値に到達すべきだと思う。

にも注意しているその数字または場合を知りますそこにはディスクの読み書き速度よりも速いため、読み込み速度が遅くなる可能性があり、書き込みキャッシュをいっぱいにした後、書き込み速度は通常はディスクの書き込み速度よりも遅くなります読み取り速度。

関連する問題