ошибка

ая с OpenMP 4.0, определяемое пользователем сокращение поддерживается. Поэтому я определил сокращение на std :: vector в C ++ именно изВот, Он отлично работает с 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;
}

Каждый поток добавляет 1 ко всем элементам w (свой локальный w), и в конце все они добавляются вместе (сокращение). Результат для всех записей w равен 4 для GNU, но случайный для компилятора intel. Кто-нибудь знает, что здесь происходит?

Ответы на вопрос(1)

Ваш ответ на вопрос