multithreading optimization pthreads openmp

multithreading - Paralelización: pthreads o OpenMP?



optimization (7)

¿Hay alguna razón (aparte de la legibilidad) para usar OpenMP sobre pthreads?

Mike tipo de tocó esto:

OpenMP también tiene ventajas similares en portabilidad, ya que muchos compiladores para diferentes plataformas lo soportan ahora, como con pthreads

Crypto++ es multiplataforma, lo que significa que 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 modernos de Windows 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 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.

A continuación se muestra un ejemplo de Crypto ++ precomputando algunos valores utilizados en las firmas de Rabin-Williams usando Tweaked Roots como lo describe Bernstein en firmas RSA y firmas de Rabin-Williams ...

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); } }

Encaja con la observación de Mike: el control y la sincronización del grano fino no eran realmente necesarios. La paralelización se utilizó para acelerar la ejecución y la sincronización no tuvo costo en el código fuente.

Y si OpenMP no está 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);

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.

¿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.


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, use pthreads. Si desea paralelizar con el menor trabajo posible, use OpenMP.

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


OpenMP es ideal cuando necesita realizar la misma tarea en paralelo (es decir, en múltiples datos), 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.

Vea esta página:

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


OpenMP requiere un compilador que lo admita y que funcione 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 lo que Charles Leiserson escribió sobre DIY multihilo .

Pthreads es un estándar POSIX ( IEEE POSIX 1003.1c ) para bibliotecas, mientras que las especificaciones OpenMP deben implementarse 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.


OpenMP se elige para la memoria compartida para programas basados ​​en tareas. Para los programas basados ​​en subprocesos pthreads se usa. Pthreads se parece más a C / FORTRAN en términos de lenguajes de programación, lo que significa que hay mucho control en sus manos mientras que OpenMP es el Java o Python que proporciona una solución fácil pero no hay mucho control disponible para nosotros.


Otra razón: 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ás una 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.

Solo piensa en tus requisitos y trata de entender: ¿es suficiente OpenMP para ti? Ahorrará mucho tiempo.


Su pregunta es similar a la pregunta "¿Debo programar C o ensamblaje?", C es OpenMP y el ensamblado es subprocesos.

Con pthreads puede hacer una paralelización mucho mejor, 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.