roblema del compilador @Intel (C ++) con la reducción de OpenMP en std :: vector
Since OpenMP 4.0, se admite la reducción definida por el usuario. Así que definí la reducción en std :: vector en C ++ exactamente desdeaqu. Funciona bien con GNU / 5.4.0 y GNU / 6.4.0, pero devuelve valores aleatorios para la reducción con intel / 2018.1.163.
Este es el ejemplo:
#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;
}
Cada hilo agrega 1 a todas las entradas w (su w local) y al final todas se suman (reducción). El resultado para todas las entradas w es 4 con GNU, pero aleatorio con el compilador de intel. ¿Alguien tiene alguna idea de lo que está sucediendo aquí?