2015-02-27 2 views
1

Я играю с функцией задачи omp и столкнулся с проблемой. У меня есть следующий код:все задачи omp планируются в том же потоке

void function1(int n, int j) 
{ 
    //Serial part 
    #pragma omp parallel 
    { 
     #pragma omp single nowait 
     { 
      //execcute function1() for every n 
      for (i=0; i<n; i++) 
      { 
       //create a task for computing only large numbers of n 
       if (i <= 10) 
        //execute serial 
       else 
        #pragma omp task 
        //call function again 
        function1(n, j+1); 
        printf("task id:\n", omp_get_thread_num()); 
      } 
     } 
    } 
} 

Сейчас код будет производить правильный результат, но производительность гораздо медленнее, чем оригинальная серийная версия. После некоторого расследования я обнаружил, что все задачи выполняются в потоке 0, несмотря на то, что в общей сложности всего 4 потока. Кто-нибудь знает, что здесь происходит? Заранее спасибо!

ответ

0

Прагма означает, что следующий блок должен выполняться одним потоком. В этом случае это означает, что весь цикл выполняется одним потоком. Это должно решить вашу проблему:

void function1(int n, int j) 
{ 
    //Serial part 
    #pragma omp parallel 
    { 
     //execcute function1() for every n 
     for (i=0; i<n; i++) //Notice this is outside the pragma 
     { 
      #pragma omp single nowait //Notice this is inside the loop 
      { 
       //create a task for computing only large numbers of n 
       if (i <= 10) 
        //execute serial 
       else 
        #pragma omp task 
        //call function again 
        function1(n, j+1); 
        printf("task id:\n", omp_get_thread_num()); 
      } 
     } 
    } 
} 
+0

Нет. Теперь каждая нить выполняет тот же цикл и создает кучу идентичных задач. Наличие единой директивы делает этот поток создаёт все задачи, которые затем выполняются всеми потоками. –