Подходит ли распараллеливание циклов, содержащих вызовы функций,
или гораздо удобнее распараллеливание циклов, которые выполняют базовые операции внутри.
Например, целесообразно ли размещать директивы распараллеливания, как показано ниже?
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)
}
}