2014-05-20 3 views
0

У меня есть код следующим образом:OpenMP: уменьшение суммы - неправильный результат, если не использовать + =

#include <stdio.h> 
#include <omp.h> 

#define N  10 
double x[N]; 
int main(void) 
{ 
    double sum = 0.0; 
#pragma omp parallel 
    { 
#pragma omp for 
     for (int i = 0; i < N; ++ i) 
      x[i] = (double) i; 

#pragma omp for reduction(+:sum) 
     for (int i = 0; i < N; ++ i) 
     { 
      sum += (double) x[i]; 
     } 
    } 

    printf("%le\n", sum); 

    return 0; 
} 

Выход на 45, который имеет смысл. Однако, если я заменю sum += (double) x[i] на sum = (double) x[i], выход будет всегда 43. Может ли кто-нибудь объяснить, почему это происходит?

Спасибо!

+1

Назначение ('=') перезапишет старое значение. выражение 'a + = b' означает« читать a, добавить b и сохранять результат в « – sp2danny

ответ

0

Я думаю, что знаю, что здесь происходит. Я думал, что sum был скопирован для каждой Итерации, но на самом деле sum скопирован для каждой НИТИ. У меня есть 8 потоков, поэтому один из них потерял свое начальное значение. Решаемые. Спасибо за все ваши ответы здесь!

+0

» Использовать предложение firstprivate для инициализации переменной 'sum' для первого потока, хотя это не обязательно для предложения« сокращение » , – elbaulp

+0

@ algui91 Зачем нам это нужно? – xuhdev

+0

нет, вам это не нужно, вам понадобится, если вы не используете 'сокращение',' сокращение' берет на себя заботу о инициализации 'sum' – elbaulp

3

Если вы замените sum += (double) x[i] на sum = (double) x[i], вы не будете дурачить результат, следовательно, sum сохранит значение последней итерации.

Смежные вопросы