¿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);
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
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. –
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