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」。これらの変更で、私はあなたのディスク速度の最大値に到達すべきだと思う。
にも注意しているその数字または場合を知りますそこにはディスクの読み書き速度よりも速いため、読み込み速度が遅くなる可能性があり、書き込みキャッシュをいっぱいにした後、書き込み速度は通常はディスクの書き込み速度よりも遅くなります読み取り速度。
ディスクの読み取りと書き込みのパフォーマンスを適切にテストするまでは、ディスクのパフォーマンスを推測するための基礎がありません。 「適切なテスト」とは、よく確立されたものの1つを実行することを意味し、インターネット上で簡単に見つけることができ、その目的のために利用可能なベンチマークです。もちろん、あなたのプログラムが非効率であるという結論を導き出すことはできません。ディスクの(理論的な)最大転送速度を達成するには十分なI/Oがないだけかもしれません。または、読み書きの混在により、最大転送速度に近くなることがあります。 –
何をしているのか、何をしていないのかについての指標を得る方法が必要です。 これは、コード内のデバッグ行、Intelインスペクタなどのようなものです。 したがって、I/Oタイマーを使用してタイマーを計算することができます。 小さなブロックを書き込んだり読んだりすると、物事を遅くするのに十分なプロセスを得ている。 1つのスレッドからすべてのI/Oを実行し、ノード全体に作業を分散させることは珍しいことではありません。 問題を解決するには、1スレッドまたは2スレッドで小さな問題を解決する必要があります。私は競合状態を疑う...またはファイルが正しく閉じる/フラッシュされていない。 – Holmz