Pregunta

La mayoría de la gente en informática científica utiliza 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 fácil de optimizar.

¿Fue útil?

Solución

Básicamente se reduce a qué nivel de control que desea sobre su paralelización. OpenMP es grande si todo lo que queremos hacer es añadir unas declaraciones #pragma y tienen una versión paralela de su código con bastante rapidez. Si usted quiere hacer las cosas realmente interesantes con codificación MIMD o colas compleja, todavía se puede hacer todo esto con OpenMP, pero es probablemente mucho más fácil de usar roscado en ese caso. 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.

Así que estás en lo cierto - si necesita un control ajustado por encima de su paralelización, utilizar pthreads. Si quieres poner en paralelo con el menor trabajo posible, utilizar OpenMP.

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

Otros consejos

Otra razón: la OpenMP es basado en tareas, Pthreads se basa hilo. Esto significa que OpenMP asignará el mismo número de hilos como el número de núcleos. Así obtendrá escalable solución. No es tarea tan fácil de hacer que el uso de hilos primas.

La segunda opinión: OpenMP ofrece funciones de reducción: cuando se necesita para calcular los resultados parciales en las discusiones y combinarlos. Se puede implementar simplemente usando una sola línea de código. Pero el uso de hilos primas que debería hacer más trabajo.

Sólo pensar en sus necesidades y tratar de entender: es OpenMP suficiente para usted? Se ahorrará un montón de tiempo.

OpenMP requiere un compilador que lo soporta, y trabaja con pragmas. La ventaja de esto es que al compilar sin OpenMP-apoyo (PCC, por ejemplo, o Clang / LLVM a partir de ahora), el código todavía compilará. También, echar un vistazo a lo que Charles Leiserson escribió sobre bricolaje multihilo .

Pthreads es un estándar POSIX ( IEEE POSIX 1003.1c ) para las bibliotecas, mientras especificaciones OpenMP se van a implementar en los compiladores; dicho esto, hay una gran variedad de implementaciones pthread (por ejemplo OpenBSD rthreads, NPTL), y un número de compiladores que soporta OpenMP (GCC por ejemplo con la bandera -fopenmp, MSVC ++ 2008).

Pthreads sólo son eficaces para la paralelización cuando varios procesadores están disponibles, y sólo cuando el código está optimizado para el número de procesadores disponibles. Código de OpenMP es más-fácilmente escalable como resultado. Usted puede mezclar código que compila con OpenMP con código utilizando pthreads, también.

Esta pregunta es similar a la pregunta "¿Debo programar C o montaje", siendo C OpenMP y montaje siendo pthreads.

Con pthreads que puede hacer mucho mejor paralelización, mejor significado muy firmemente ajustado a su algoritmo y hardware. Esta será una gran cantidad de trabajo, sin embargo.

Con pthreads También es mucho más fácil de producir un código mal paralelizada.

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

Mike se refirió a esto:

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

Cripto++ Es multiplataforma, es decir, se ejecuta en Windows, Linux, OS X y BSD.Utiliza OpenMP para soporte de subprocesos en lugares donde la operación puede ser costosa, como la exponenciación modular y la multiplicación modular (y donde se pueden realizar operaciones concurrentes).

Windows no admite pthreads, pero los compiladores modernos de Windows sí admiten OpenMP.Entonces, si desea portabilidad para usuarios que no son *nix, OpenMP suele ser una buena opción.


Y como Mike también señaló:

OpenMP es excelente si todo lo que quieres hacer es agregar algunas declaraciones #pragma y tener una versión paralela de tu código con bastante rapidez.

A continuación se muestra un ejemplo de Crypto++ precalculando algunos valores utilizados en las firmas Rabin-Williams usando Tweaked Roots como lo describe Bernstein en Firmas RSA y firmas 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 detallado y la sincronización no eran realmente necesarios.Se utilizó la paralelización para acelerar la ejecución y la sincronización se realizó sin costo alguno en el código fuente.

Y si OpenMP es 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);

OpenMP es ideal cuando se necesita para llevar a cabo la misma tarea en paralelo (es decir, de múltiples datos), una especie de máquina SIMD (instrucción única de múltiples datos).

Se necesita Pthreads cuando se desea realizar (muy diferentes) tareas en paralelo, tales como, por ejemplo, la lectura de datos en un único hilo y la interacción con el usuario en otro hilo.

Vea esta página:

http://berenger.eu / blog / c-CPP-OpenMP-vs-pthread-OpenMP-o-posix-hilo /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top