как использовать omp барьер в цикле while без равного количества итераций для потоков - PullRequest
2 голосов
/ 25 декабря 2009

Я пытаюсь реализовать задачу listranking (известную также по ярлыкам) с помощью omp, чтобы иметь префиксы сумм массива W. Я не знаю, правильно ли я использую флеш-прагму .. И у меня есть предупреждение при компиляции: «область барьера не может быть тесно вложена в область разделения работы, критической, упорядоченной, основной или явной задачи»

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

main(int argc, char *argv[])
{ 
  int Q[9]={1,2,3,4,5,6,7,8,0};
  int W[8]={1,2,3,4,5,6,7,8};
  int i,j=6,id;

  printf("Before:\n");
  for(j=0;j<8;j++)
  printf("%d",W[j]);
  printf("\n");
  #pragma omp parallel for shared(Q,W) private(id) num_threads(7)
  for (i=6; i>=0; i--)
  {
    id= omp_get_thread_num();
    while((Q[i] !=0)&& (Q[Q[i]] !=0))
    { 
      #pragma omp flush(W)

       W[i]=W[i]+W[Q[i]];

      #pragma omp flush(W)

       printf("Am %d \t W[%d]= %d",id,i,W[i]);

     #pragma omp barrier    
     #pragma omp flush(Q)
     Q[i]=Q[Q[i]];
     #pragma omp flush(Q)
     printf("Am %d \n Q[%d]= %d",id,i,Q[i]);
   };
 }
  printf("Result:\n");
  for(j=0; j<8; j++)
   printf("%d \t",W[j]);
   printf("\n");

}

ПОМОГИТЕ PLEAAAAAAAAAAASE!

1 Ответ

4 голосов
/ 25 декабря 2009

Вы не можете использовать барьер внутри параллельной omp, вы можете использовать барьер только внутри параллельной области.

Причина этого в том, что если ваша петля имеет значение от 1 до N, барьер внутри будет эффективно создавать N нитей, что будет иметь отрицательное перфорированное воздействие, если N велико.

Я не искал здесь алгоритм, но два разумных варианта - это рефакторинг, чтобы использовать 2 параллельных цикла для цикла один за другим, где есть барьер, или рефакторинг вашего алгоритма для использования параллельной области #pragma.

Я посмотрел алгоритм ранжирования списка, вам будет полезно найти реализацию префикса sum или scan, если вы должны использовать openmp.

-Rick

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