2009-06-01 53 views
41

La mayoría de las personas en informática científica usan OpenMP como un cuasi estándar cuando se trata de paralelización de memoria compartida.Paralelización: pthreads o OpenMP?

¿Hay alguna razón (aparte de la legibilidad) para usar OpenMP sobre pthreads? Este último parece más básico y sospecho que podría ser más rápido y más fácil de optimizar.

Respuesta

37

Básicamente se reduce a qué nivel de control desea sobre su paralelización. OpenMP es genial si todo lo que quiere hacer es agregar unas pocas sentencias #pragma y tener una versión paralela de su código con bastante rapidez. Si desea hacer cosas realmente interesantes con codificación MIMD o colas complejas, aún puede hacer todo esto con OpenMP, pero probablemente sea mucho más sencillo utilizar el subprocesamiento en ese caso. OpenMP también tiene ventajas similares en portabilidad, ya que muchos compiladores para diferentes plataformas lo soportan ahora, como con pthreads.

Por lo tanto, tiene toda la razón: si necesita un control preciso de su paralelización, utilice pthreads. Si desea paralelizar con el menor trabajo posible, use OpenMP.

Cualquiera que sea la forma en que decida ir, ¡buena suerte!

20

Otro motivo: el OpenMP se basa en tareas, Pthreads está basado en subprocesos. Significa que OpenMP asignará la misma cantidad de hilos que la cantidad de núcleos. Entonces obtendrá solución escalable. No es tarea fácil hacerlo con hilos crudos.

La segunda opinión: OpenMP proporciona características de reducción: cuando necesita calcular resultados parciales en hilos y combinarlos. Puede implementarlo simplemente usando una sola línea de código. Pero usando hilos crudos deberías hacer más trabajo.

Simplemente piense en sus requisitos y trate de entender: ¿es OpenMP suficiente para usted? Ahorrará mucho tiempo.

+0

Sírvanse proporcionar detalles sobre la escalabilidad solución. ¿La escalabilidad solo se aplica en tiempo de compilación o se determina en tiempo de ejecución? ¿O la escalabilidad del tiempo de ejecución solo puede hacerse con subprocesos? – awiebe

+1

Puede establecer el número de subprocesos creados ya sea en compilación o en tiempo de ejecución. Si elige tener el número establecido en tiempo de ejecución, puede establecer el número de subprocesos a través de un número de variable numérica de entorno, de modo que se pueda establecer fácilmente en un número apropiado en la arquitectura en la que lo esté ejecutando. –

+0

Esta respuesta no tiene sentido. OpenMP es un modelo de subprocesamiento al igual que los hilos POSIX. OpenMP ni siquiera tenía tareas para las primeras versiones. – Jeff

6

OpenMP requiere un compilador que lo admita, y funciona con pragmas. La ventaja de esto es que, al compilar sin OpenMP-support (por ejemplo, PCC o Clang/LLVM a partir de ahora), el código aún se compilará. Además, eche un vistazo a what Charles Leiserson wrote about DIY multithreading.

Pthreads es un estándar POSIX (IEEE POSIX 1003.1c) para bibliotecas, mientras que OpenMP specifications se implementarán en compiladores; Dicho esto, hay una variedad de implementaciones pthread (por ejemplo, OpenBSD rthreads, NPTL) y una serie de compiladores que admiten OpenMP (por ejemplo, GCC con el indicador -fopenmp, MSVC++ 2008).

Pthreads solo son efectivos para la paralelización cuando hay varios procesadores disponibles, y solo cuando el código está optimizado para la cantidad de procesadores disponibles. El código para OpenMP es más fácilmente escalable como resultado. También puedes mezclar código que compila con OpenMP con código usando pthreads.

+1

El último párrafo de esta respuesta es todo tipo de error. – Jeff

2

Su pregunta es similar a la pregunta "¿Debería programar C o ensamblar?", C es OpenMP y el ensamblado es subprocesos.

Con pthreads puede hacer mucho mejor la paralelización, mejor significado muy ajustado a su algoritmo y hardware. Sin embargo, esto será mucho trabajo.

Con pthreads también es mucho más fácil producir un código mal paralelo.

+0

Esto supone que OpenMP se implementa utilizando Pthreads. Eso no es obligatorio, aunque generalmente es cierto. Si OpenMP se implementó al descubierto en una arquitectura especializada, podría ser más rápido que Pthreads. – Jeff

+0

@Jeff No estoy asumiendo eso y mi respuesta es independiente de los detalles de la implementación. Los OPMP y C son más de "alto nivel" que las pthreads y el ensamblaje. Es por eso que creo que mis declaraciones siguen siendo ciertas, sin importar cómo se implementen C y OpenMP. – steffen

+0

Parece que está combinando la simplicidad sintáctica de OpenMP con cargas semánticas en el tiempo de ejecución. ¿Ha comparado la [especificación del hilo POSIX] (http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread.h.html) con la [especificación OpenMP 4] (http://www.openmp.org/ mp-documents/OpenMP4.0.0.pdf)? En particular, ¿ha considerado lo que se requiere para 'pthread_create()' frente a 'pragma omp parallel {}'? – Jeff

0

OpenMP es ideal cuando necesita realizar en la misma tarea en paralelo (es decir, en datos múltiples), una especie de máquina SIMD (datos múltiples de una sola instrucción).

Pthreads es necesario cuando desea realizar tareas (bastante diferentes) en paralelo, como, por ejemplo, leer datos en un hilo e interactuar con el usuario en otro hilo.

Ver esta página:

http://berenger.eu/blog/c-cpp-openmp-vs-pthread-openmp-or-posix-thread/

+0

OpenMP siempre ha sido compatible con algo más que el paralelismo de datos. ¿Realmente entiendes OpenMP? – Jeff

0

¿Hay alguna razón (aparte de facilitar la lectura) a utilizar OpenMP sobre pthreads?

Mike tipo de se refirió a esto:

OpenMP también tiene ventajas similares en portabilidad en que muchos de los compiladores para diferentes plataformas de apoyo que ahora, al igual que con pthreads

Crypto++ es multiplataforma, es decir, se ejecuta en Windows, Linux, OS X y BSD. Utiliza OpenMP para enhebrar soporte en lugares donde la operación puede ser costosa, como exponenciación modular y multiplicación modular (y donde se puede realizar una operación concurrente).

Windows no es compatible con pthreads, pero los compiladores de Windows modernos son compatibles con OpenMP. Entonces, si quiere portabilidad para los que no son nix, entonces OpenMP es a menudo una buena opción.


Y como Mike también señaló:

OpenMP es ideal si lo que quieres hacer es añadir unas declaraciones #pragma y tienen una versión paralela de su código con bastante rapidez.

a continuación es un ejemplo de Crypto ++ precomputen algunos valores usados ​​en firmas Rabin-Williams utilizando Roots pellizcados como se describe por Bernstein en RSA signatures and Rabin-Williams signatures...:

void InvertibleRWFunction::Precompute(unsigned int /*unused*/) 
{ 
    ModularArithmetic modp(m_p), modq(m_q); 

    #pragma omp parallel sections 
    { 
     #pragma omp section 
      m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8); 
     #pragma omp section 
      m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8); 
     #pragma omp section 
      m_pre_q_p = modp.Exponentiate(m_q, m_p - 2); 
    } 
} 

Se ajusta con la observación de Mike - control de grano fino y la sincronización era realmente no es necesario. La paralelización se utilizó para acelerar la ejecución y la sincronización no tuvo costo en el código fuente.

Y si es OpenMP no disponible, el código se reduce a:

m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8); 
m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8); 
m_pre_q_p = modp.Exponentiate(m_q, m_p - 2);