2016-10-24 2 views
0

Моя цель - распараллелить раздел в моей программе Fortran. Поток программы:Программа не работает быстрее с помощью OpenMP

  1. Чтение данных из файла
  2. сделать некоторые вычисления
  3. записать результаты в 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

Не тратьте время на распараллеливание ввода/вывода, если у вас нет оборудования для его поддержки. (по моему опыту люди, у которых есть такие аппаратные средства, не задают такой вопрос, поэтому я предполагаю, что вы этого не делаете.) Если у вас есть два потока, пытающихся использовать одну запись для записи (типа) одновременно, просто замедлив обе операции записи, пока o/s играет хорошо, и дает каждому равную долю, и вы оплачиваете накладные расходы для всех этих переключателей от одного к другому. –

+0

Также неясно, что вы указали, есть ли у вас какой-либо параллелизм в вашем коде вообще - см. Http://stackoverflow.com/questions/2770911/how-does-the-sections-directive-in-openmp- распределить работу для объяснения. И когда вы разобрали это, 'single', скорее всего, будет более результативным, чем' section' для записи файла. –

+1

Вам не указана директива 'OMP PARALLEL', она где-то скрыта? Возможно, вы хотели вместо этого «OMP PARALLEL SECTIONS»? Но Марк прав, он все равно не ускорится, потому что дисковые операции трудно распараллелить. –

ответ

0

В общем случае можно разделить научные вычислительные коды на связанные с пропускной способностью и вычислительные алгоритмы. Алгоритмы, связанные с пропускной способностью, - это всего лишь несколько операций с данными, которые им нужны. Как и у O (n) данных, где O (n) выполняются флопы. Рассматривая скорость жесткого диска или скорость сетевого подключения, ввод-вывод также является операцией с пропускной способностью и, следовательно, не является или только плохо параллелизуемым.
Если вы действительно хотите получить производительность из распараллеливания, разделите код на связанные с пропускной способностью и алгоритмы с вычислительной привязкой и используйте свое время для распараллеливания более поздних.

+0

В моем случае запись данных в двоичные файлы занимает 80% полосы пропускания, поэтому я пытаюсь писать в разные файлы одновременно (параллельно). – ridi

+0

Предполагая, что запись в файлы ограничена пропускной способностью жесткого диска, вы разделите полосу пропускания, распараллеливая ее. Из-за управления задачами для файловой системы и аппаратного обеспечения замедления классического жесткого диска во время параллельных действий, которые еще больше замедляют работу программы. Одной из возможностей ускорения процесса записи является использование ввода/вывода с отображением памяти, которое обычно намного быстрее. Но в этом случае вам нужно написать свой ввод-вывод в C и связать его с Fortran, если вам это действительно нужно. –

0

Если вы решите проблему более точно, есть сотни специалистов, которые хотят ее решить. Из комментария к ответу выше я вижу, что вы используете двоичный вывод, но по-прежнему имеет пропускную способность, чтобы писать быстрее, это означает, что скорость диска в порядке и вы не ограничены разбором, а скорее то, что вы не используете фактическую программу быстрее, чем это.

Так оптимизируйте свой код, чтобы он догнал вашу скорость записи, вместо увеличения скорости записи с одинаково медленным кодом.

Написание их 2 файла последовательно с максимальной пропускной способностью так же быстро и намного проще, чем писать параллельно (с той же максимальной скоростью).

Если я ошибаюсь, и вы действительно ограничены IO, возможно, этот другой вопрос/ответ может вам помочь: How to avoid programs in status D.

Смежные вопросы