У меня есть серийный код:
double* a = malloc((1000000) * sizeof(double));
double* b = malloc((1000000) * sizeof(double));
double totalA = 0;
for (int i = 0; i < 1000000; i++) {
if (i == 0) {
a[i] = sin(i);
}
b[i] = sin(i+1);
if (i < 1000000-1) {
a[i+1] = b[i];
}
totalA += a[i];
}
Выход totalA
после этого последовательного цикла равен 0.232883978073
.
Затем у меня есть версия OpenMP (примечание: все переменные повторно инициализируются):
double* a = malloc((1000000) * sizeof(double));
double* b = malloc((1000000) * sizeof(double));
double totalA = 0;
#pragma omp parallel for reduction(+:totalA)
for (int i = 0; i < 1000000; i++) {
if (i == 0) {
a[i] = sin(i);
}
b[i] = sin(i+1);
if (i < 1000000-1) {
a[i+1] = b[i];
}
totalA += a[i];
}
Однако вывод totalA
из этого кода равен -0.733714826779
.
Я не могу понять для жизни меня, почему это отличается.
Спасибо.
ОБНОВЛЕНИЕ
После некоторой игры кажется, что операторы if
в цикле странным образом игнорируются. Фактические операторы в блоках if
выполняются на всех итерациях цикла (как если бы предложение if
не существовало).
Например, изменение блока if
на:
if (i < 555555) {
a[i+1] = b[i];
}
кажется, что нет абсолютно никакой разницы.
Я до сих пор не знаю, что здесь происходит.