Поведение omp_get_max_threads в параллельных регионах
Вопрос
Я компилирую этот фрагмент кода в Snow Leopard и Linux и получаю разные результаты.В Snow leopard первый вызов omp_get_max_threads возвращает 2 — мое количество ядер, а второй — 1.В Linux оба вызова возвращают 4 — мое количество ядер.Я думаю, что Linux ведет себя правильно, я прав?Оба варианта верны, и я просто неправильно понимаю эту функцию?
#include <stdio.h>
#include <omp.h>
int main() {
printf(" In a serial region; max threads are : %d\n", omp_get_max_threads());
#pragma omp parallel
{
#pragma omp master
printf(" In a parallel region; max threads are : %d\n", omp_get_max_threads());
}
}
Вывод Mac:
In a serial region; max threads are : 2
In a parallel region; max threads are : 1
Выход Linux:
In a serial region; max threads are : 4
In a parallel region; max threads are : 4
Решение
этот вызов хорошо указан в спецификации openmp.Linux здесь ведет себя правильно.с учетом вышесказанного вы находитесь в главном регионе, который фактически является последовательным и является основным потоком, поэтому вызов num threads объясним.Если вы не привязаны к чистому C, я бы посоветовал вам взглянуть на библиотеку C++ tbb и особенно на подмножество ppl, вы найдете больше общности и компонуемости, как в случае вложенного параллелизма.Я говорю с телефона, поэтому прошу прощения за опечатки.
Другие советы
С поставляемым Apple gcc 4.2 [gcc версии 4.2.1 (Apple Inc.сборка 5566)] на Leopard я получаю те же результаты, что и вы (за исключением того, что у моего MacBook меньше ядер).
In a serial region; max threads are : 2
In a parallel region; max threads are : 1
То же самое для 4.3.4 от MacPorts.
Однако с gcc 4.4.2 и 4.5.0 20091231 (экспериментальная) от MacPorts на том же компьютере я получаю:
In a serial region; max threads are : 2
In a parallel region; max threads are : 2
Похоже, это не проблема Mac и Linux, а проблема с версией gcc.
P.S.OpenMP может выполнять вложенный параллелизм.
Напоминаем, что существует форум, посвященный только OpenMP, который читают разработчики OpenMP, а также эксперты OpenMP со всего мира.Все закончилось на официальном сайте OpenMP: http://openmp.org/forum
Отличное место, чтобы задать подобные вопросы и найти множество других ресурсов на openmp.org.
Странный.Я всегда получаю ожидаемое поведение (используя 4.2.1, сборка 5646 точка 1) с OS X 10.6.2:
На моем Mac Pro
In a serial region; max threads are : 8
In a parallel region; max threads are : 8
и на моем iMac
In a serial region; max threads are : 2
In a parallel region; max threads are : 2
Должно быть, здесь происходит что-то еще.Компиляция с помощью просто?
gcc fname.c -fopenmp