gpt4 book ai didi

c++ - OpenMP 最小值缩减和 std::min

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:24 25 4
gpt4 key购买 nike

我正在测试 OpenMP 最小缩减。如果我像下面这样编写代码,它将返回正确的结果:res = 3。

#include <omp.h>
#include <iostream>
#include <algorithm>

int main(){

omp_set_num_threads(5);

float res=10;

#pragma omp parallel for default(shared) reduction(min:res)
for(int i1 = 0; i1 <= 10; i1++)
for(int i0 = 0; i0 <= 10; i0++)
if(res > 3.0+i1+20*i0)
res = 3.0+i1+20*i0;

std::cout << "res = " << res << std::endl;

return 0;
}

但是如果我以另一种方式编写,将“if”语句替换为“std::min”,那么结果是错误的:res = 10。

#include <omp.h>
#include <iostream>
#include <algorithm>

int main(){

omp_set_num_threads(5);

float res=10;

#pragma omp parallel for default(shared) reduction(min:res)
for(int i1 = 0; i1 <= 10; i1++)
for(int i0 = 0; i0 <= 10; i0++)
res = std::min(res,static_cast<float>(3.0+i1+20*i0));

std::cout << "res = " << res << std::endl;

return 0;
}

OpenMP 最小值缩减是否会干扰 std::min?

最佳答案

首先,您的代码是符合规范的:并行内的代码类型无关紧要。

reduction 子句意味着每个线程都有自己的私有(private)拷贝,初始化为 min 运算符的中性元素(即 reduction 中的最大可表示数)项目类型),他们将使用它直到构造结束。届时,这些私有(private)拷贝将使用缩减标识符缩减为原始列表项,在您的情况下是 min 运算符。所以这里没有竞争条件。

我使用与您相同的版本执行了您的代码,并且运行良好:icpc (ICC) 16.0.0 和 OpenMP 版本 201307。此问题是否与您使用的 C++ 标准 header 有关?

关于c++ - OpenMP 最小值缩减和 std::min,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39393634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com