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í?

Respuestas a la pregunta(1)

Su respuesta a la pregunta