OpenMP Неожиданный вывод - PullRequest
       4

OpenMP Неожиданный вывод

1 голос
/ 15 октября 2011

У меня есть два потока с параллелью для, но этот не разбивается на потоки:

#pragma omp parallel sections
  {
#pragma omp section
    {
      for(int i=0;i<4;++i)
        printf("Loop A %d %d\n", omp_get_thread_num(),2);
    }
#pragma omp section
    {
      for(int i=0;i<4;++i)
        printf("Loop B %d %d\n", omp_get_thread_num(),3);
    }           
  }

Выход:

Запуск ...

Loop A 0 2
Loop A 0 2
Loop A 0 2
Loop A 0 2
Loop B 0 3
Loop B 0 3
Loop B 0 3
Loop B 0 3

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

Это может произойти по ряду причин.Я перечислю возможные из них, которые я знаю:

1: Убедитесь, что у вас действительно многоядерный компьютер.Если это одноядерный компьютер (без HT), он будет работать только с одним потоком.

2: если это в Visual Studio, вам нужно включить поддержку OpenMP.Недостаточно просто включить заголовок:

Project -> Properties -> Configuration Properties -> C/C++ -> Language -> Open MP Support

измените его на Yes (/openmp), и он должен быть включен.

Я правильно выполнил ваш код с настройкой OpenMP и получил следующее:

Loop A 0 2
Loop B 2 3
Loop B 2 3
Loop B 2 3
Loop B 2 3
Loop A 0 2
Loop A 0 2
Loop A 0 2

Так что я думаю, что ваш код правильный.

1 голос
/ 15 октября 2011

Это может произойти слишком быстро. Я пробовал большее количество итераций, и оно работает как положено:

// gcc -std=c99 *.c -fopenmp && ./a.out
#include <stdio.h>
#include <omp.h>

enum { N = 10000,  M = N/2 };

static void loop(char* s, int d) {
  for(int i=0;i<N;++i)
    if (i % M == 0)
      printf("Loop %s %d %d %d\n", s, i, omp_get_thread_num(),d);
}

int main() {
#pragma omp parallel sections
  {
#pragma omp section
    loop("A", 2);
#pragma omp section
    loop("B", 3);
  }
}

выход

Loop A 0 7 2
Loop B 0 4 3
Loop A 5000 7 2
Loop B 5000 4 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...