Есть ли какой-либо причине (кроме удобочитаемости) использовать OpenMP над Pthreads?
Майк вид коснулся этого:
OpenMP также имеет такие же преимущества в переносимости в том, что много компиляторов для различных платформ поддерживают его сейчас, как с Pthreads
Crypto++ является кросс-платформенный, что означает в прогонах Windows, Linux, OS X и BSD. Он использует OpenMP для поддержки потоковой передачи в тех местах, где операция может быть дорогостоящей, например, модульное возведение в степень и модульное умножение (и при этом возможна параллельная работа).
Windows не поддерживает pthreads, но современные компиляторы Windows поддерживают OpenMP. Поэтому, если вы хотите переносить на не-nix, то OpenMP часто является хорошим выбором.
И как Майк также отметил:
OpenMP является большим, если все, что вам нужно сделать, это добавить несколько заявлений #pragma и имеют параллельную версию кода довольно быстро.
Ниже приведен пример Crypto ++ предварительного вычисления некоторые значения, используемые в подписи Рабина-Williams, используя отлажены Корни, как описано Бернштейн в 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);
}
}
Это согласуется с наблюдением Майка - точный контроль зерна и синхронизация была выполнена не нужно. Параллелизация была использована для ускорения выполнения, а синхронизация была бесплатной в исходном коде.
И если OpenMP является не доступен, код сводится к:
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);
Пожалуйста разработать на масштабируемость решения. Масштабируемость применяется только во время компиляции или определяется во время выполнения? Или можно ли масштабировать время выполнения только потоками? – awiebe
Вы можете установить количество потоков, созданных либо во время компиляции, либо во время выполнения. Если вы решите установить число, установленное во время выполнения, вы можете установить количество потоков через numthreads переменной окружения, чтобы его можно было легко установить на соответствующий номер в любой архитектуре, в которой вы его используете. –
Этот ответ не имеет смысла. OpenMP - это потоковая модель, подобная потокам POSIX. У OpenMP даже не было задач для первых нескольких версий. – Jeff