set_num_threads внутри параллели не работает - PullRequest
0 голосов
/ 25 сентября 2018

Я изо всех сил пытаюсь установить количество потоков в 1 внутри параллельной области.Я установил барьер, чтобы все потоки останавливались в этой точке, и я могу свободно установить количество потоков равным 1 (и выполнение потоков не будет).Но куда бы я ни поместил omp_set_num_threads (1), он всегда возвращал 3. Можно ли изменить количество потоков во время выполнения?Как я могу это сделать?

#import<iostream>
#import<omp.h>
#import<stdio.h>

int main(){

int num_of_threads;
std::cin>>num_of_threads;
omp_set_dynamic(0); 
#pragma omp parallel if(num_of_threads>1) num_threads(3)
{
    int t_id = omp_get_thread_num();
    int t_total = omp_get_num_threads();
    printf("Current thread id: %d \n Total number_of_threads: %d \n",t_id,t_total);
    #pragma omp barrier
    #pragma omp single
    { 
    omp_set_num_threads(1);
    t_id = omp_get_thread_num();
    t_total = omp_get_num_threads();
    printf("Single section \n Current thread id: %d \n Total number_of_threads: %d \n",t_id,t_total);
    }
}


}

1 Ответ

0 голосов
/ 25 сентября 2018

TL; DR Вы не можете изменить количество потоков в параллельной области.

Помните, что это пул потоков, которые разветвляются в начале параллельной области.Внутри они даже не синхронизированы (если вы не говорите им тоже), поэтому OpenMP нужно будет завершить некоторые из них в неизвестной позиции - очевидно, плохая идея.

Ваш #pragma omp single делает следующий раздел кодавыполняться одним потоком, поэтому нет необходимости устанавливать его через omp_set_num_threads. НО он не меняет ваш пул, он просто советует компилятору запланировать следующий раздел в одном потоке, а остальные игнорируют его.

Чтобы показать это поведение, например, в университетских целях, я бы предложилраспечатать только идентификатор потока в параллельной и отдельной части.Таким образом, вы уже можете сказать, работает он или нет.

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