2013-06-07 3 views
2

Это тестирует часть кода:Снижение ошибок OpenMP для ошибок цикла?

float a = 0; 
    float b = 0; 
    int c = 0; 
    int d = 0; 
    #pragma omp parallel for schedule (dynamic, 1) reduction(+ : a, b, c, d) 
    for(i=0; i<100; i++) { 
     a +=1; 
     b +=1; 
     c +=1; 
     d +=1; 
    } 

    printf("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d); 

По некоторым причинам мои результаты всегда:

a: 100, b: 100, c: 0, d: 202 
a: 100, b: 100, c: 0, d: 202 
a: 100, b: 100, c: 0, d: 202 
a: 100, b: 100, c: 0, d: 202 
a: 100, b: 100, c: 0, d: 202 
a: 100, b: 100, c: 0, d: 202 
a: 100, b: 100, c: 0, d: 202 

Почему не а, Ь, с, d все равно 100?

ответ

1

Вы используете форматы %d для печати чисел с плавающей точкой. Это вызывает неопределенное поведение. Использование:

printf("a: %f, b: %f, c: %d, d: %d\n", a, b, c, d); 

И вы увидите, что получите правильные ответы.

+0

wow, so simple, thx – Derek

+0

Без проблем, рад помочь. –