首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将do/while转换为并行do/while循环

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

Stack Overflow用户
提问于 2015-06-12 01:22:54
回答 1查看 338关注 0票数 1

我很难将do/while{}转换成OpenMP。我正在跟踪康奈尔虚拟工作室的示例: While循环

这是最初的do/while{}。变量rremodn只是Crypto++类。rreIntegersmodnModularArithmeticRandomize在指定的范围内创建一个整数。

代码语言:javascript
复制
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的回答没有意义,请检查一下历史。

代码语言:javascript
复制
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版本中做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-12 02:01:29

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30793934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档