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 . . .

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

Зачем вам нужно больше одного потока для этой программы? Очевидно, что 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 */

}

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