私の目標は、Fortranプログラムでセクションを並列化することです。プログラムの流れは次のとおりです。ファイル OpenMPでプログラムが遅くなることはありません
- 読み出しデータは、いくつかの計算
- を作る私は以来、書き込み処理を並列化したいここでは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
しかし、このプログラムはそれほど速く進んでいません。だから私は何か不足していると思う?
ハードウェアをサポートしていない限り、I/Oを並列化する時間を無駄にしないでください。 (私の経験では、このようなハードウェアを持っている人はこの種の質問をしないので、あなたはそうではないと仮定しています。)同じ時間に1つの書き込みヘッドを使用しようとするスレッドが2つある両方の書き込み操作を遅くしながら、o/sがうまくいって、それぞれに均等なシェアを与え、すべてのスイッチのオーバーヘッドを一方から他方へと支払うだけです。 –
投稿した内容から、あなたのコードに何かの並列性があるかどうかは不明です。http://stackoverflow.com/questions/2770911/how-does-the-sections-directive-in-openmp-説明のため配布作業。そして、あなたがそれをソートしたときに、 'single'はファイル作成のための' section'よりも実行力がありそうです。 –
'OMP PARALLEL'指示文がありません。どこかに隠されていますか?代わりに、代わりに 'OMP PARALLEL SECTIONS'を望んでいたでしょうか?しかし、Markはそうです。ディスク操作を並列化するのが難しいため、Markを速くすることはできません。 –