OpenMP не будет запускать более одного потока - PullRequest
0 голосов
/ 12 июня 2018

Следующий код не будет запускать более одного потока.Я безуспешно пытался выполнить следующее (Visual Studio 2015 Update 3):

  • включил поддержку OpenMP ( Свойства конфигурации -> C / C ++ -> Язык -> Поддержка Open MP -> Да(/ openmp) )
  • определил переменную среды OMP_NUM_THREADS в Visual Studio ( Свойства конфигурации -> Отладка -> Среда -> OMP_NUM_THREADS = 4 )
  • определенопеременная окружения OMP_NUM_THREADS в Windows
  • , называемая omp_set_num_threads (4) в коде
  • , пыталась использовать #pragma omp parallel num_threads (4)

Я не былвозможность получить более одного потока.

#include <iostream>
#include <omp.h>

int main(int argc, char* argv[])
{

    int nb_threads = omp_get_max_threads();
    printf(">> omp_get_max_thread()\n>> %i\n", nb_threads);

    omp_set_num_threads(4);
    printf(">> omp_set_num_threads(4)\n");

    nb_threads = omp_get_num_threads();
    printf(">> omp_get_num_threads()\n>> %i\n", nb_threads);

    int id;
    #pragma omp parallel
    {
        id = omp_get_thread_num();
        printf(">> omp_get_thread_num()\n>> %i\n", id);
    }
    return 0;
}

Вывод:

>> omp_get_max_thread()
>> 8
>> omp_set_num_threads(4)
>> omp_get_num_threads()
>> 1
>> omp_get_thread_num()
>> 0

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы должны использовать опцию компилятора /openmp для включения #pragma omp в исходном коде.

Если /openmp не указано в компиляции, компилятор игнорирует предложения и директивы OpenMP.

0 голосов
/ 13 июня 2018

Проблема в том, что у вас есть только один id, и доступ к нему сериализован.Предоставляя каждому потоку доступ к своим собственным id, они могут выполняться параллельно, поэтому мы хотим изменить прагму на:

#pragma omp parallel private(id)

Таким образом, доступ к id не сериализуется, икаждый поток может выполняться самостоятельно, поэтому мы получаем вывод, подобный этому:

>> omp_get_max_thread()
>> 4
>> omp_set_num_threads(4)
>> omp_get_num_threads()
>> 1
>> omp_get_thread_num()
>> 0
>> omp_get_thread_num()
>> 3
>> omp_get_thread_num()
>> 2
>> omp_get_thread_num()
>> 1
...