omp_set_num_threads всегда возвращает 0, и я не могу получить номер потока с помощью omp_get_thread_num () - PullRequest
1 голос
/ 03 ноября 2010

У меня есть библиотека классов C ++, которая использует omp для распараллеливания.Я заметил мою проблему, когда он всегда использовал все ядра на моем процессоре, независимо от того, что omp_set_num_threads (threadCount) имел в качестве входных данных.

Поэтому, исследуя, я понял, что единственный способ заставить работать num_threads - это не использовать метод omp_set_num_threads (), а установить num_threads в параллельной директиве следующим образом:в вышеприведенном случае вывод:

Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0

Если я вместо этого использую следующее:

    omp_set_num_threads(4);
#pragma omp parallel //num_threads(4)
    {
        int i = omp_get_thread_num();
        printf_s("Hello from thread %d\n", i);
    }

Вывод

Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0

Однако я создал новыйПроект консольного приложения типа Win32 omp_set_num_threads работает, и я получаю вывод:

Привет из потока 0 Привет из потока 2 Привет из потока 1 Привет из потока 3

Я должен думать, что это имеетделать с типом проекта или каким-либо параметром проекта.Кто-нибудь знает, что это может быть?

С наилучшими пожеланиями Ричард

Ответы [ 2 ]

0 голосов
/ 03 ноября 2010

Я решил проблему сейчас, поэтому эту ветку можно закрыть, если кто-то не может ответить, почему это происходит, объяснение следующее:

Проблема, с которой я столкнулся, заключалась в том, что свойство Common Language Runtime Support на страницах свойств моего проекта C ++ было установлено как No Common Language Runtime Support. Мы изменили это, поскольку Visual Studio 2010 не поддерживала intellisense для приложений C ++ с этим параметром, установленным на «Поддержка поддержки общего языка». Но, похоже, настройка необходима для работы потоков, как я объяснил выше.

Кто-нибудь знает почему?

С наилучшими пожеланиями Ричард

0 голосов
/ 03 ноября 2010

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

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