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

Convert do/while into parallel do/while loop

本文关键字:while do 循环 并行 转换      更新时间:2023-10-16

我在将do/while{}转换为 OpenMP 时遇到问题。我正在遵循示例:来自康奈尔虚拟研讨会的循环。

这是原始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));

并行化部分是生成随机数后的两个雅可比测试。雅可比比(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 版本失败,所以我知道出了点问题。

我在 OMP 版本的do/while{}中做错了什么?

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

见 https://msdn.microsoft.com/en-us/library/c3dabskb.aspx

删除它或显式将其指定为共享。