将do / while转换为并行do / while循环

时间:2015-06-12 01:22:54

标签: c++ openmp do-while

我无法将do/while{}转换为OpenMP。我正在跟随康奈尔大学虚拟研讨会的Example: While Loop

这是原始do/while{}。变量rremodn只是Crypto ++类。 rreIntegers,而modnModularArithmeticRandomize创建一个指定范围内的整数。

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版本中做错了什么?

1 个答案:

答案 0 :(得分:2)

private(stop)告诉omp为每个线程提供stop的唯一实例,而不是共享公共值。

请参阅https://msdn.microsoft.com/en-us/library/c3dabskb.aspx

删除它或明确指定为共享。