Comportamiento de omp_get_max_threads en las regiones paralelas
Pregunta
compilo este fragmento de código en Snow Leopard y Linux y consigo resultados diferentes. El leopardo de nieve, la primera llamada de omp_get_max_threads devuelve 2, que es mi número de núcleos, mientras que el segundo vuelve 1. En Linux, tanto para llamadas de retorno 4, que es mi número de núcleos. Creo que Linux tiene el comportamiento correcto, estoy en lo cierto? Son ambas correctas y sólo tengo una mala interpretación de esta función?
#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());
}
}
salida de Mac:
In a serial region; max threads are : 2
In a parallel region; max threads are : 1
Linux de salida:
In a serial region; max threads are : 4
In a parallel region; max threads are : 4
Solución
Esta llamada está bien especificado en la especificación OpenMP. Linux tiene el comportamiento correcto en este caso. con lo que se dice, se encuentra en una región principal que es efectivamente serie y FHE el hilo principal, por lo que el num hilos llamada es explicable. si no eres atado a pura c les animo a mirar a la biblioteca de C ++ TBB y en particular el subconjunto PPL, encontrará más generalidad y del composability como para el paralelismo anidado. Estoy en myphone así que disculpas por los errores tipográficos aquí.
Otros consejos
Con Apple suministra gcc 4.2 [gcc versión 4.2.1 (Apple Inc. construir 5566)] en Leopard, consigo los mismos resultados que usted (excepto que mi MacBook tiene un menor número de núcleos).
In a serial region; max threads are : 2
In a parallel region; max threads are : 1
Lo mismo ocurre con 4.3.4 de MacPorts.
Sin embargo, con gcc 4.4.2 y 4.5.0 20091231 (experimental) de MacPorts, en el mismo equipo me sale:
In a serial region; max threads are : 2
In a parallel region; max threads are : 2
Parece que este no es un problema de Mac frente a Linux, pero debido a la versión de gcc.
P.S. OpenMP puede hacer paralelismo anidado.
Sólo un recordatorio, hay un foro dedicado sólo para OpenMP, y leído por los desarrolladores de OpenMP, así como expertos OpenMP todo el mundo. Se acabó en el sitio oficial OpenMP: http://openmp.org/forum
Un gran lugar para hacer preguntas como esta, y para encontrar una gran cantidad de otros recursos a openmp.org
extraño. Siempre me dan el comportamiento esperado (usando 4.2.1, BUILD 5646 puntos 1) con OS X 10.6.2:
En mi Mac Pro
In a serial region; max threads are : 8
In a parallel region; max threads are : 8
y en mi iMac
In a serial region; max threads are : 2
In a parallel region; max threads are : 2
Debe ser algo más en juego aquí. Compilar con solo?
gcc fname.c -fopenmp