【发布时间】:2018-10-17 18:21:24
【问题描述】:
从 OpenMP 4.0 开始,支持用户定义的缩减。所以我完全从here 定义了 C++ 中 std::vector 的缩减。它适用于 GNU/5.4.0 和 GNU/6.4.0,但它返回随机值以用于减少 intel/2018.1.163。
这是一个例子:
#include <iostream>
#include <vector>
#include <algorithm>
#include "omp.h"
#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() {
omp_set_num_threads(4);
int size = 100;
std::vector<double> w(size,0);
#pragma omp parallel for reduction(vec_double_plus:w)
for (int i = 0; i < 4; ++i)
for (int j = 0; j < w.size(); ++j)
w[j] += 1;
for(auto i:w)
if(i != 4)
std::cout << i << std::endl;
return 0;
}
每个线程将所有 w 条目(其本地 w)加 1,最后将所有条目加在一起(减少)。对于 GNU,所有 w 条目的结果是 4,但对于 intel 编译器是随机的。有谁知道这里发生了什么?
【问题讨论】:
标签: c++ openmp intel gnu reduction