Paralelización:pthreads o OpenMP?


La mayoría de las personas en computación 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.

Author: hanno, 2009-06-01

7 answers

Básicamente se reduce al nivel de control que desea sobre su paralelización. OpenMP es genial si todo lo que quieres hacer es agregar algunas instrucciones #pragma y tener una versión paralela de tu código bastante rápido. Si quieres hacer cosas realmente interesantes con la codificación MIMD o colas complejas, todavía puedes hacer todo esto con OpenMP, pero probablemente sea mucho más sencillo usar threading en ese caso. OpenMP también tiene ventajas similares en portabilidad en que una gran cantidad de compiladores para diferentes plataformas lo soportan ahora, como con pthreads.

Así que tienes toda la razón: si necesitas un control afinado sobre tu paralelización, usa pthreads. Si desea paralelizar con el menor trabajo posible, utilice OpenMP.

Sea cual sea el camino que decidas tomar, ¡buena suerte!

 37
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-01 16:10:52

Otra razón: el OpenMP está basado en tareas, Pthreads está basado en subprocesos. Esto significa que OpenMP asignará el mismo número de hilos que el número de núcleos. Así obtendrá solución escalable. No es tan fácil hacerlo usando raw hilos.

La segunda opinión: OpenMP proporciona características de reducción: cuando necesita calcular resultados parciales en subprocesos y combinarlos. Puedes implementarlo 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: ¿OpenMP es suficiente para ti? Ahorrarás mucho tiempo.

 20
Author: Vladimir Obrizan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-20 14:24:46

OpenMP requiere un compilador que lo soporte, y trabaja con pragmas. La ventaja de esto es que cuando se compila sin soporte OpenMP (por ejemplo, PCC o Clang/LLVM a partir de ahora), el código seguirá compilándose. También, echa un vistazo a lo que Charles Leiserson escribió sobre DIY multithreading.

Pthreads es un estándar POSIX ( IEEE POSIX 1003.1 c) para bibliotecas, mientras que las especificaciones OpenMP deben implementarse en compiladores; dicho esto, hay una variedad de implementaciones de pthread (por ejemplo, OpenBSD rthreads, NPTL), y una serie de compiladores que soportan OpenMP (por ejemplo, GCC con la bandera-fopenmp, MSVC++ 2008).

Los Pthreads solo son efectivos para la paralelización cuando hay varios procesadores disponibles, y solo cuando el código está optimizado para el número 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.

 6
Author: Anonymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-07 01:55:05

Tu pregunta es similar a la pregunta "Debería programar C o ensamblado", C siendo OpenMP y ensamblado siendo pthreads.

Con pthreads se puede hacer mucho mejor 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 paralelizado.

 2
Author: steffen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-22 11:56:26

¿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 soportan ahora, como con pthreads

Crypto++ es multiplataforma, lo que significa que se ejecuta en Windows, Linux, OS X y los BSD. Utiliza OpenMP para el soporte de roscado 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 soporta pthreads, pero los compiladores modernos de Windows sí soportan OpenMP. Así que si quieres portabilidad a los no-*nix, entonces OpenMP es a menudo una buena opción.


Y como Mike también señaló:

OpenMP es genial si todo lo que quieres hacer es añadir algunas instrucciones #pragma y tener una versión paralela de tu código bastante rápido.

A continuación se un ejemplo de Crypto++ precomputando algunos valores usados en firmas Rabin-Williams usando Raíces Retocadas 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 de grano fino y la sincronización no eran realmente necesarios. La paralelización se utilizó para acelerar la ejecución, y la sincronización llegó sin costo en el código fuente.

Y si OpenMP es no disponible, el código de 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);
 1
Author: jww,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-13 22:46:18

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

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

Ver esta página:

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

 0
Author: user1284631,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-02 10:37:58

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

 0
Author: Abinav Ravi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-24 07:39:42