openMP не создает потоки в Visual Studio

Моя версия openMP не давала никакого прироста скорости. У меня двухъядерный компьютер, и загрузка процессора всегда составляет 50%. Поэтому я попробовал пример программы, приведенный в Wiki. Похоже, компилятор openMP (Visual Studio 2008) не создает более одного потока.

Это программа:

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

 int main (int argc, char *argv[]) {
   int th_id, nthreads;
   #pragma omp parallel private(th_id)
   {
     th_id = omp_get_thread_num();
     printf("Hello World from thread %d\n", th_id);
     #pragma omp barrier
     if ( th_id == 0 ) {
       nthreads = omp_get_num_threads();
       printf("There are %d threads\n",nthreads);
     }
   }
   return EXIT_SUCCESS;
 }

Это вывод, который я получаю:

Hello World from thread 0
There are 1 threads
Press any key to continue . . .

person Nishanth    schedule 23.12.2010    source источник


Ответы (4)


С программой все в порядке, так что, вероятно, есть какая-то проблема с тем, как она компилируется или запускается. Это VS2008 Pro? Быстрый поиск в Google показывает, что OpenMP не включен в стандарте. Включен ли OpenMP в Свойствах -> C/C++ -> Язык -> OpenMP? (Например, вы компилируете с помощью /openmp)? Устанавливается ли переменная среды OMP_NUM_THREADS в 1 где-то, когда вы запускаете это?

person Jonathan Dursi    schedule 23.12.2010
comment
Большое спасибо. Я не компилировал с /openmp. теперь работает как шарм :) - person Nishanth; 23.12.2010

Если вы хотите протестировать свою программу с более чем одним потоком, существует несколько конструкций для указания количества потоков в параллельной области OpenMP. Они в порядке старшинства:

  • Оценка предложения if
  • Настройка предложения num_threads
  • Использование библиотечной функции omp_set_num_threads()
  • Настройка переменной среды OMP_NUM_THREADS
  • Реализация по умолчанию

Похоже, что ваша реализация по умолчанию использует один поток (при условии, что в вашей среде не установлено значение OMP_NUM_THREADS=1).

Например, для тестирования с 4 потоками вы можете добавить num_threads(4) в директиву #pragma omp parallel.

Как отмечалось в другом ответе, вы действительно не увидите никакого «ускорения», потому что вы не используете какой-либо параллелизм. Но разумно захотеть запустить программу «hello world» с несколькими потоками, чтобы проверить ее.

person mhowison    schedule 02.06.2011

Как упоминалось здесь, http://docs.oracle.com/cd/E19422-01/819-3694/5_compiling.html Я заработал, установив для переменной среды OMP_DYNAMIC значение FALSE.

person Rajesh Gautam    schedule 13.09.2013

Зачем вам нужно более одного потока для этой программы? Очевидно, что OpenMP понимает, что ему не нужно создавать дополнительный поток для запуска программы без циклов, без кода, который мог бы выполняться параллельно.

Попробуйте запустить что-нибудь параллельно с OpenMP. Что-то вроде этого:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define CHUNKSIZE   10
#define N       100

int main (int argc, char *argv[]) 
{
int nthreads, tid, i, chunk;
float a[N], b[N], c[N];

/* Some initializations */
for (i=0; i < N; i++)
  a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid)
  {
  tid = omp_get_thread_num();
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %d\n", nthreads);
    }
  printf("Thread %d starting...\n",tid);

  #pragma omp for schedule(dynamic,chunk)
  for (i=0; i<N; i++)
    {
    c[i] = a[i] + b[i];
    printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
    }

  }  /* end of parallel section */

}

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

person Pablo Santa Cruz    schedule 23.12.2010