Можно ли запустить omp для без потока 0? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть сценарий использования, в котором я хочу запустить две функции параллельно: первая содержит работу, которую я хочу выполнить в потоке 0, а другая содержит цикл «для», который я хочу разделить между оставшимися 3 потоки. мой код выглядит так:

void fct1(){
    //do some work1
};

void fct2(){
    int p;
    #pragma omp for schedule(static)
    for (p=start; p < end; p++) {
        //do some work2
    }
};

int main(){
    #pragma omp parallel 
    {
        int tid = omp_get_thread_num();
        if (tid==0)
            fct1();

        if(tid!=0)
            fct2();
    }
return 0;
}

проблема в том, что "omp for" в fct2 зависает, потому что он также ожидает, пока поток 0 выполнит свою часть.

У вас есть предложения? Спасибо.

1 Ответ

1 голос
/ 25 июня 2019

Вы можете сделать это с прагмой single (или master, если вы действительно хотите нить 0). Директива nowait позволит другим потокам продолжать работу.

Вы должны использовать динамическое планирование в цикле for, так как оно лучше работает с переменным числом потоков. И если поток 0 завершил свою работу, он присоединится к пулу.

#include <stdio.h>
#include <omp.h>

#define end 2000

void fct1(){
  printf("Hey I am thread %d\n", omp_get_thread_num());
};

void fct2(){
  int p;
# pragma omp for schedule(dynamic,128) // adapt chunk size to your problem
  for (p=0; p < end; p++) {
    printf("%d (%d)\t",p,omp_get_thread_num());
  } // all, including thread 0, will be synchronized here
};

int main(){
# pragma omp parallel 
  {
#   pragma omp single nowait
    fct1();

    fct2();
  }
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...