将 do/while 转换为并行 do/while 循环
Convert do/while into parallel do/while loop
我在将do/while{}
转换为 OpenMP 时遇到问题。我正在遵循示例:来自康奈尔虚拟研讨会的循环。
这是原始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));
可并行化部分是生成随机数后的两个雅可比测试。雅可比比(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
删除它或显式将其指定为共享。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何使用 do while 循环确定最高值和最低值
- do while 循环中的 if 语句以 yes 或 no 结尾
- 在 C 或 C++ 中,循环可以同时具有 "do" 和"while"部分吗?
- 使用 while 或 do while 退出循环
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 为什么我的 Do-while 循环无法在C++中运行菜单
- 如果语句不会在 do - while 循环中运行
- 如何在c++中读取do-while循环中的空白
- 什么是'do while loop'的真实应用?
- 将嵌套的 for 循环更改为 do-while 循环
- 如何修复不会在退出选择时终止的 do-while 循环
- 为什么这个do-while循环每隔一个循环只写入数组?
- C++ do/while 循环和 if/else: 骰子游戏 -- 第 75 行错误:"Cout"之前的预期"While" -- 如何解决这个问题?
- 为菜单创建基本的用户输入验证(使用基本的 while/do-while 等循环)
- 使用 while / do-while 循环进行数组元素设置
- 为什么 for/while/do-while 在执行相同的任务时被放置在 c/c++ 中