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

У меня немного неприятная проблема с openmp.Когда я запускаю следующий код, кажется, что он работает только в одном потоке.

    omp_set_num_threads(8);    
#pragma omp parallel for schedule(dynamic)
    for(size_t i = 0; i < jobs.size(); i++) //jobs is a vector
    {
        std::cout << omp_get_thread_num() << "\t" << omp_get_num_threads() << "\t" << omp_in_parallel() << std::endl;
        jobs[i].run();
    }

Это печатает ...

0 1 1

для каждой строки.

Я вижу, используя top, что openmp порождает столько потоков, сколько у меня есть набор задач процесса.Они в основном бездействуют, пока он работает.Программа скомпилирована и связана с флагом -fopenmp с помощью gcc.Я использую redhat 6. Я также попытался использовать параметр num_threads(8) в прагме, который не имел значения.Программа связана с другой библиотекой, которая также использует openmp, так что, возможно, это проблема.Кто-нибудь знает, что может вызвать такое поведение?Во всем моем прошлом опыте openmp это сработало.

1 Ответ

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

Можете ли вы напечатать ваши jobs.size ()?

Я сделал быстрый тест, и он работает:

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

int main()
{
    omp_set_num_threads(2);

#pragma omp parallel for ordered schedule(dynamic) 
    for(size_t i = 0; i < 4; i++) //jobs is a vector
    {
#pragma omp ordered
        std::cout << i << "\t" << omp_get_thread_num() << "\t" << omp_get_num_threads() << "\t" << omp_in_parallel() << std::endl;
    }
     return 0;
}

Я получил:

icpc -qopenmptest.cpp && ./a.out

0 0 2 1
1 1 2 1
2 0 2 1
3 1 2 1
...