ошибка
ая с 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. Кто-нибудь знает, что здесь происходит?