Я пытаюсь запустить эту программу с несколькими потоками.Почему эта программа OpenMP дает мне разные ответы каждый раз?
#include <stdio.h>
#include <time.h>
#include <omp.h>
#define NUM_THREADS 4
static long num_steps = 1000000000;
int main()
{
int i;
double x, pi, sum = 0.0;
double step = 1.0/(double)num_steps;
clock_t start = clock(), diff;
#pragma omp parallel for num_threads(NUM_THREADS) reduction (+:sum)
for (i = 0; i < num_steps; i++)
{
x = (i+0.5)*step;
sum += 4.0/(1.0 + x*x);
}
#pragma omp ordered
pi = step*sum;
printf("pi = %.15f\n %d iterations\n", pi, num_steps);
diff = clock() - start;
int msec = diff * 1000/CLOCKS_PER_SEC;
printf("Time taken %d seconds %d milliseconds", msec/1000, msec%1000);
return 0;
}
, добавив #pragma omp parallel for num_threads(NUM_THREADS) reduction (+:sum)
. У меня также есть #pragma omp ordered
после цикла for, который я не думаю, что мне действительно нужно, потому что нить не должна продолжаться до тех пор, пока все потоки не будут выполнены с циклом for. Это верно? Будет ли это также причиной, по которой я получаю только второе увеличение производительности по сравнению с ее запуском в виде однопоточной программы? Это 6 секунд по сравнению с 7 секундами для меня.
Я не могу ответить, почему эта программа дает мне другой ответ для pi каждый раз, когда я запускаю его?
Я протестировал вашу программу в vs2015, она дает мне такое же значение pi каждый раз – HDJEMAI
Очень странно.Просто скопировал и вставил его снова и провел дважды. Впервые я получил 3.141737761473218, а во второй раз я получил 3.141576654805244. Я нахожусь в Windows, если это что-то значит. Возможно, я должен попробовать это в Linux. – rangeme
Я получаю все время 3.141592653589971 Ведьма кажется хорошей – HDJEMAI