Моя цель - распараллелить раздел в моей программе 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
Но эта программа не движется быстрее. Значит, я думаю, что я что-то упустил?
Не тратьте время на распараллеливание ввода/вывода, если у вас нет оборудования для его поддержки. (по моему опыту люди, у которых есть такие аппаратные средства, не задают такой вопрос, поэтому я предполагаю, что вы этого не делаете.) Если у вас есть два потока, пытающихся использовать одну запись для записи (типа) одновременно, просто замедлив обе операции записи, пока o/s играет хорошо, и дает каждому равную долю, и вы оплачиваете накладные расходы для всех этих переключателей от одного к другому. –
Также неясно, что вы указали, есть ли у вас какой-либо параллелизм в вашем коде вообще - см. Http://stackoverflow.com/questions/2770911/how-does-the-sections-directive-in-openmp- распределить работу для объяснения. И когда вы разобрали это, 'single', скорее всего, будет более результативным, чем' section' для записи файла. –
Вам не указана директива 'OMP PARALLEL', она где-то скрыта? Возможно, вы хотели вместо этого «OMP PARALLEL SECTIONS»? Но Марк прав, он все равно не ускорится, потому что дисковые операции трудно распараллелить. –