我无法将do/while{}
转换为OpenMP。我正在跟随康奈尔大学虚拟研讨会的Example: While Loop。
这是原始do/while{}
。变量r
,re
和modn
只是Crypto ++类。 r
和re
为Integers
,而modn
为ModularArithmetic
。 Randomize
创建一个指定范围内的整数。
do {
r.Randomize(rng, Integer::One(), m_n - Integer::One(), Integer::ANY);
rInv = modn.MultiplicativeInverse(r);
} while (rInv.IsZero() || (Jacobi(r % m_p, m_p) == -1) || (Jacobi(r % m_q, m_q) == -1));
可并行化部分是生成随机数后的两个Jacobi测试。 Jacobi比模块化反转更便宜( O(m·log(n)) )( O(n ^ 2) )。此外,雅各比在75%的时间内都失败了,所以我应该在模块化反演上花费周期之前进行雅可比测试。
这是我将其翻译成的内容。 编辑:外部#pragma omp parallel private(stop) { ... }
已删除。如果kfsone的答案没有意义,请查看历史记录。
bool stop = false;
while(!stop)
{
r.Randomize(rng, Integer::One(), m_n - Integer::One());
int jp, jq;
#pragma omp parallel sections
{
#pragma omp section
jp = Jacobi(r % m_p, m_p);
#pragma omp section
jq = Jacobi(r % m_q, m_q);
}
if ((jp != -1) && (jq != -1))
{
rInv = modn.MultiplicativeInverse(r);
if(rInv.NotZero()) {
stop = true;
}
}
}
自我测试在非OMP版本中成功,但在OMP版本中失败,所以我知道出了问题。
我在do/while{}
的OMP版本中做错了什么?
答案 0 :(得分:2)
private(stop)
告诉omp为每个线程提供stop
的唯一实例,而不是共享公共值。
请参阅https://msdn.microsoft.com/en-us/library/c3dabskb.aspx
删除它或明确指定为共享。