c++ - OpenMP:为什么减少比拆分任务快得多
问题描述
我实现了 2 个版本的 pi 近似值。我对其进行了测试,发现一个版本要快得多,但我真的不明白为什么。在第一个版本中,我创建了一个定义数量的进程大小的数组并更新了索引,在第二个版本中,我只使用了缩减。
第一个版本:
#pragma omp parallel private(x) shared(sum_vector)
{
int tid = omp_get_thread_num();
for (int i = tid; i < num_steps; i += threads_number){
x = (i+0.5)*step;
sum_vector[tid] += 4.0/(1.0+x*x);
}
}
第二个版本:
#pragma omp parallel reduction(+:sum) private(x)
{
int nthreads = omp_get_num_threads();
int id = omp_get_thread_num();
for (int i = id; i < num_steps; i += nthreads){
x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
}
}
对于 100 万次或更高次的迭代,第二个版本的速度几乎快了两倍。
我会很感激每一个答案!先感谢您!
解决方案
推荐阅读
- continuous-integration - 如何设置 ScrutinizerCI 以运行 NightwatchJS UI 测试
- git - Git checkout 只在某些机器上给我指针文件
- sql - 使用存储过程返回 0 行的 SSRS 报告
- ios - 为 UIBezierPath 创建旋转动画
- r - 按 ID 组合行
- arduino - Serial.read 返回值与串行监视器中的值不同
- docker - 对独立容器使用覆盖网络会引发超出上下文期限
- reactjs - 登录 React 后重定向到自定义 URL
- botframework - 当您缺乏添加所需范围的权限时,有没有办法使用 To Do Skill
- javascript - 正则表达式:具有数组支持的拆分对象表示法路径字符串