gpt4 book ai didi

c++ - 声明 Reduction over Vector,在 1 个线程上运行会给出与没有 openmp 时不同的结果

转载 作者:行者123 更新时间:2023-11-30 04:44:49 25 4
gpt4 key购买 nike

即使我在 1 个线程上运行,我有以下代码给出了错误的答案。如果 for 循环之前的两个 pragma 被注释掉,代码将给出正确的结果。怎么会这样?我认为在 1 个线程上,使用和不使用 OpenMP 之间没有区别,除了可能有一些小的开销。另外,我应该怎么做才能获得“正确的行为”?当我只有一个 for 循环时,我不会遇到同样的问题,但如果有超过 1 个,它就不会像我想的那样工作。

#include<iostream>
#include<vector>
#include<algorithm>
#include<omp.h>
using namespace std;
#pragma omp declare reduction(vec_double_plus : std::vector<double> : \
std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<double>())) \
initializer(omp_priv = omp_orig)

int main() {
vector<int> v;
vector<double> w(2);
for (int i = 0; i < 1000; i++) {
if (i % 2 == 0) {
v.push_back(0);
}
else {
v.push_back(1);
}
}
#pragma omp parallel for reduction(vec_double_plus:w)
for (int i = 0; i < 500; i++) {
int r = v[i];
w[r] += i;
}
#pragma omp parallel for reduction(vec_double_plus:w)
for (int i = 500; i < 1000; i++) {
int r = v[i];
w[r] += i;
}
std::cout << w[0] << std::endl;
std::cout << w[1] << std::endl;
}

最佳答案

问题是,代码假设来自外部作用域的原始变量是用归约的中性元素初始化的——即 w 全是零。它将从此外部创建本地拷贝并将其再次添加到原始拷贝。这甚至发生在单个线程上。

您可以更改代码以使用零初始化 omp_priv,如下所示:

initializer(omp_priv = decltype(omp_orig)(omp_orig.size()))

代码looks familiar to me ,很抱歉造成困惑。我会修复原始答案。

关于c++ - 声明 Reduction over Vector,在 1 个线程上运行会给出与没有 openmp 时不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559790/

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