Распараллеливание циклов, содержащих вызов функции - PullRequest
5 голосов
/ 25 января 2010

Подходит ли распараллеливание циклов, содержащих вызовы функций, или гораздо удобнее распараллеливание циклов, которые выполняют базовые операции внутри.

Например, целесообразно ли размещать директивы распараллеливания, как показано ниже?

main(){
..
#omp paralel ..
for (i=0;i<100;i++){
a[i] = foo(&datatype , ...);
...
}
..
}

int foo(datatype *a,...){
//doing complex operations here
//calling other functions etc.
}

Спасибо, Уилл Ричард и Фкахлер, эти комментарии были полезны, и я буду глубоко смотреть на книгу, предложенную Рчрдом. Но до конца дня я хотел, чтобы существующий код C (действительно большой цикл, который остается на вершине программы) был параллелизирован с openMP, если это возможно.

На данный момент мне нужна помощь по параллелизации хотя бы некоторых частей цикла. Чтобы упростить задачу, вместо того, чтобы делать parellelezing содержимое всего цикла, как я могу сделать так, чтобы только часть его работала параллельно

for(i to N){   
  work1() --(serial)
  work2() --(serial)
  Work3() --( PARALLEL)
  work4() --(serial)
}

//does it make sense adding critical sections except work3

#omp parallel for private(Ptr)
for(i to N){   
 #omp single
 {
  work1() --(serial)
  work2() --(serial)
 }
  Work3(Ptr) --( PARALLEL)
 #omp single
 {
  work4() --(serial)
 }
}

Ответы [ 2 ]

1 голос
/ 25 января 2010

Необходимо знать три бита информации:

  1. имеет ли значение порядок выполнения foo?
  2. влияет ли foo () на разделяемое состояние, и если да, то есть ли соответствующая блокировка?
  3. сколько времени занимает цикл без openmp?

Если у вас есть задача, которая занимает много времени - несколько секунд или более - и она может быть разбита на независимые части (иногда путем рефакторинга, например, путем разделения на работы и сбора результатов для каждой работы перед объединением), тогда она может быть стоит попытаться распараллелить это.

Профиль! * * 1013

0 голосов
/ 25 января 2010

Ответы на подобные вопросы можно найти в MIT Press Book, Using OpenMP, которая была написана некоторыми людьми, которые разработали спецификации OpenMP.

Дополнительную информацию можно найти на веб-сайте openmp.org, в том числе на форуме с экспертами OpenMP. http://openmp.org/

...