我很难将do/while{}转换成OpenMP。我正在跟踪康奈尔虚拟工作室的示例: While循环。
这是最初的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测试。(O(m·log(n)))比模反演(O(n^2))便宜。而且,Jacobi失败了75%,所以我应该在模块反转之前执行Jacobi测试。
这是我翻译成的。编辑:外部#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版本中做错了什么?
发布于 2015-06-12 02:01:29
private(stop)告诉omp给每个线程一个唯一的stop实例,而不是共享一个公共值。
请参阅https://msdn.microsoft.com/en-us/library/c3dabskb.aspx
删除它或显式地将其指定为共享。
https://stackoverflow.com/questions/30793934
复制相似问题