openMP не создает темы в визуальной студии - PullRequest
14 голосов
/ 23 декабря 2010

Моя версия openMP не дала никакого ускорения.У меня двухъядерный компьютер, и загрузка процессора всегда составляет 50%.Поэтому я попробовал пример программы, приведенной в вики.Похоже, компилятор 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 . . .

Ответы [ 4 ]

17 голосов
/ 23 декабря 2010

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

3 голосов
/ 02 июня 2011

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

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

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

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

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

0 голосов
/ 13 сентября 2013

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

0 голосов
/ 23 декабря 2010

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

Попробуйте запустить несколько параллельных программ с OpenMP.Что-то вроде this :

#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 */

}

Если вы хотите что-то хардкорное, попробуйте запустить один из этих .

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