2016-10-24 20 views
0

私の目標は、Fortranプログラムでセクションを並列化することです。プログラムの流れは次のとおりです。ファイル OpenMPでプログラムが遅くなることはありません

  • から

    1. 読み出しデータは、いくつかの計算
    2. を作る私は以来、書き込み処理を並列化したいここでは2つの異なるファイル

    に結果を書き込みます別のファイルに書き込む。

    module foo 
         use omp_lib 
         implicit none 
         type element 
          integer, dimension(:), allocatable   :: v1, v2 
          real(kind=8), dimension(:,:), allocatbale :: M 
         end type element 
    
        contains 
    
        subroutine test() 
         implicit none 
         type(element)  :: e 
    
    
         do 
          e = read_data_from_file() 
    
          call compute_data(e) 
    
          !$OMP SECTIONS 
          !$OMP SECTION 
          !$ call write_to_file1(e) 
          !$OMP SECTION 
          !$ call write_to_file2(e) 
          !$OMP END SECTIONS 
         end do 
        end subroutine test 
    
    
        ... 
    
        end module foo 
    

    しかし、このプログラムはそれほど速く進んでいません。だから私は何か不足していると思う?

  • +3

    ハードウェアをサポートしていない限り、I/Oを並列化する時間を無駄にしないでください。 (私の経験では、このようなハードウェアを持っている人はこの種の質問をしないので、あなたはそうではないと仮定しています。)同じ時間に1つの書き込みヘッドを使用しようとするスレッドが2つある両方の書き込み操作を遅くしながら、o/sがうまくいって、それぞれに均等なシェアを与え、すべてのスイッチのオーバーヘッドを一方から他方へと支払うだけです。 –

    +0

    投稿した内容から、あなたのコードに何かの並列性があるかどうかは不明です。http://stackoverflow.com/questions/2770911/how-does-the-sections-directive-in-openmp-説明のため配布作業。そして、あなたがそれをソートしたときに、 'single'はファイル作成のための' section'よりも実行力がありそうです。 –

    +1

    'OMP PARALLEL'指示文がありません。どこかに隠されていますか?代わりに、代わりに 'OMP PARALLEL SECTIONS'を望んでいたでしょうか?しかし、Markはそうです。ディスク操作を並列化するのが難しいため、Markを速くすることはできません。 –

    答えて

    0

    一般に、科学的コンピューティングコードを帯域幅制限アルゴリズムと計算制限アルゴリズムで分割することができます。帯域幅に束縛されたアルゴリズムはすべて、必要なデータに対してわずかな操作しか行いません。 O(n)フロップが実行されるO(n)データを持つように。ハードディスクの速度やネットワークの接続速度を考えると、I/Oは帯域幅操作であり、ひどく並列化できない。
    実際に並列化のパフォーマンスを上げたい場合は、コードを帯域幅制限アルゴリズムと計算境界アルゴリズムに分割し、後で並列化するために時間を使います。

    +0

    私の場合、バイナリファイルにデータを書き込むには、帯域幅の80%が必要となります。なぜなら、同時に(同時に)異なるファイルに書き込もうとしているからです。 – ridi

    +0

    ファイルへの書き込みがハードディスクインタフェースの帯域幅によって制限されると仮定すると、帯域幅を並列化して分割します。ファイルシステムとハードウェアに関するタスクを管理することにより、パラレルアクション中の古典的なハードディスクの速度低下が原因で、プログラムの速度がさらに低下します。書き込み処理を高速化する1つの可能性は、通常ははるかに高速であるメモリマップI/Oを使用することです。しかし、この場合、I/OをC言語で記述し、実際に必要な場合はFortranからインタフェースする必要があります。 –

    0

    問題をより正確に指定すると、それを解決することを熱望する何百もの専門家がいます。上記のコメントから、私はあなたがバイナリ出力を使用していることがわかりますが、依然として帯域幅がより速く書けるようになっています。つまり、ディスク速度は問題なく、構文解析によって制限されません。これより速いペースでデータを取り出すことができます。

    同じように遅いコードで書き込み速度を上げるのではなく、書き込み速度に追いつくようにコードを最適化します。

    帯域幅の最大値で2つのファイルを連続して書き込むことは、並列(同じ最高速度)で書くことと同じくらい高速で簡単です。

    私が間違っていて実際にIOで制限されている場合は、How to avoid programs in status Dというこの他の質問/回答が役に立ちます。

    関連する問題