2016-10-24 6 views
1

У меня есть этот кодpragma omp for/parallel не работает?

#define N 2048 
int main(void) 
{ 
    FILE *fp1; 
    fp1=fopen("myfile.txt", "a"); 
    for(int i=0;i<N;i++) 
    { 
     #pragma omp parallel 
     { 
      int *x=malloc(sizeof(int)*N); 
      int *xtemp=malloc(sizeof(int)*N); 
      int (*adj)[N]; 
      adj=malloc(sizeof *adj *N); 
      ...//other declarations 
      #pragma omp for 
      for(int k=0;k<100;k++) 
      { 
       /* do things involving x,xtemp, adj...*/ 
      } 
      fprintf(fp1,"things \n"); 
      ... //free vectors part... 
     } 
    } 
    fclose(fp1); 
    return 0; 
} 

код кажется работать нормально, но когда я проверяю с htop использования моего процессора (i3 двухъядерных с Hyper-Threading), я вижу, что только один поток работает в 100%.

Так что я положил некоторые printf в мой код, чтобы увидеть, сколько раз я хотел бы получить такую ​​же надпись на моем терминале, как, после того, как:

#pragma omp parallel 
{ 
    printf("Hey, I'm inside the par zone!\n"); 
    .... 
} 

но мне кажется, что я получаю только один printf за время, поэтому я думаю, что работает только одно ядро. Я пробовал то же самое после части pragma omp for, но все равно получаю ту же самую проблему.

Почему кажется, что pragma omp parallel ничего не распараллеливает? Я попробовал более простую программу (простую параллельную версию hello world!), И она работает, я получаю столько марок, сколько моих основных номеров.

Я пытался поставить все вместе в #pragma omp parallel for цикле, но я получаю ошибку сегментации - ядро ​​сбрасывали ошибку ...

................... ........

Here это мой код MCVE, он дает ту же проблему. (Извините за отступы, но загрузчик файлов напортачил). Функции перед основным просто делают некоторые вычисления, используя rand(), ничего особенного.

мой сборник линия: gcc -w -std=c99 MC.c -o try -lm -fopenmp -lquadmath -O3

+0

Вы скомпилировали с помощью переключателя компилятора с поддержкой OpenMP? Например, GCC требует, чтобы '-fopenmp' использовал прагмы OpenMP. Аналогично, вы установили переменную окружения 'OMP_NUM_THREADS' в значение до запуска кода? – Gilles

+0

Да, я скомпилировал с -fopenmp, и я не установил OMP_NUM_THREADS –

+0

Не могли бы вы дать [MCVE] (http://stackoverflow.com/help/mcve) пример вашей проблемы вместе с вашей командной строкой компиляции и командой выполнения? – Gilles

ответ

1

Ваш код имеет два вопроса, которые я могу видеть:

  • Использование глобального генератора случайных чисел параллельно. Это целый мир проблем сам по себе, но быстрые исправления могут заключаться в том, чтобы использовать однопоточный RND, например rand_r(), вместо глобального rand(), или для защиты вызовов до rand() с #pragma omp critical RNG (что, вероятно, будет производительностью убийца). В любом случае rand() не подходит для серьезных работ.
  • Попытка закрыть выходной файл в параллельной области.

Теперь причина, по которой параллелизм не работает, заключается в том, что вы написали #pragma omp shared(mfield) parallel вместо #pragma omp parallel shared(mfield). Как только это исправлено, код порождает потоки, как ожидалось.

+0

Спасибо! О, боже, я не могу поверить, что весь день пытался потерять эту ошибку. –

+0

Но как это не проблема для компилятора? Он даже не предупредил меня об этом. Как это интерпретировать '#pragma omp shared (mfield) parallel'? –

+0

Из справочной страницы gcc: «-w Запретить все предупреждающие сообщения». Просто попробуйте выполнить компиляцию с '-Wall', и вы получите« mcve.c: 130: 0: warning: игнорирование #pragma omp shared [-Wunknown-pragmas] " – Gilles

0

Это, как представляется, проблема, связанная с fprintf части кода. Если я распараллеливаю только k-loop, все работает отлично. OpenMP and File I/O, очевидно, говорит то же самое.