Модификация параллельной программы
Прошу оказать помощь в модификации существующей параллельной программы, написанной с использованием библиотеки OpenMP, в такую же программу, использующую библиотеку MPI.
Существует программа вычисления степени полинома, реализованная с помощью OMP.
-------------------------------------------
--- Необходимо реализовать ввод степени полинома пользователем (у меня реализовано в самом коде программы).
--- Реализовать взаимодействие между процессами. Для этого использовать библиотеку MPI.
Один из вариантов, самый простой - главный процесс ведет диалог с пользователем или считывает входные данные из файла, затем передает данные подчиненным процессам. Подчиненные выполняют действия, возвращают результат главному. Главный собирает результаты, производит суммирование и выводит результат.
Получше вариант - параллельность не только на этапе возведения в степень но и на этапе суммирования. Процессы группируются по два-три, каждый процесс в группе, возведя в степень элемент полинома, передает данные другому процессу, выполняющему суммирование. Группа процессов, выполняющих суммирование передает данные главному процессу, который выполнит окончательное суммирование и выведет результат.
--- Снабдить кодинг программы комментариями.
-------------------------------------------
Кодинг существующей программы:
#include "stdafx.h"
#include
#include
#include
#include
#include
#define N 1000
double a[N];
void GenerateFactor (double *a)
{
int RANGE_MIN = 0;
int RANGE_MAX = 100;
srand( (unsigned)time ( NULL ) );
for (int i=1; i
a = (double) rand() / (double)
RAND_MAX;
};
int main (int argc, char *argv[])
{
double x = 1;
double y = 1, S = 0;
clock_t start, finish;
start = clock();
GenerateFactor(a);
#pragma omp parallel sections shared(S), private(x,y), num_threads(2)
{
#pragma omp section
{
printf_s("Hello from thread %d\n",
omp_get_thread_num());
for (int i=1; i
{
x = (i-0.5) / N;
y = 1;
for (int j=0; j
{
S = S + a[j]*y;
y = y * x;
}
}
}
#pragma omp section
{
printf_s("Hello from thread %d\n",
omp_get_thread_num());
for (int i=(int)N/2; i
{
x = (i-0.5) / N;
y = 1;
for (int j=0; j
{
S = S + a[j]*y;
y = y * x;
}
}
}
};
printf("S = %f\n", S);
finish = clock();
printf("Time of calculation is %f\n",
(double) (finish - start) / CLOCKS_PER_SEC);
getch();
return 0;
}
Среда работы - Visual 2005-й
Заранее благодарю за отклик!