1. Windows Visual ++.
2. , Ci=Ai+Bi, 0<=i<=n.
3. MPI, , n=10, .
4. , 3 , (n ) .
5. . .
-
i, n, a[], b[], c[] |
i = 0, n |
a[i] = i, b[i] = i; |
c[i] = a[i] + b[i]; |
i = 0, n |
#include <mpi.h>
#include "stdio.h"
#include <conio.h>
#include "iostream"
#include <time.h>
using namespace std;
int main(int argc, char* argv[])
{
int nom = 0, kol = 0, n;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &nom); //
MPI_Comm_size(MPI_COMM_WORLD, &kol); //- -
MPI_Status Status;
if (nom == 0)
{
printf("Vvedite razmernost:\n");
scanf("%d", &n);
}
// n
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
double *a, *b, *c, *c1, t1, t2, td;
double start, finish, duration, duration1;
a = new double[n];
b = new double[n];
c = new double[n];
c1 = new double[n];
int ost = n % kol;
if (nom == 0)
{
for (int i = 0; i < n; i++)
{
a[i] = i;
b[i] = i;
c[i] = 0;
c1[i] = 0;
}
for (int i = 0; i < n; i++)
{
// printf("%.1f ", a[i]);
}
printf("\n");
for (int i = 0; i < n; i++)
{
//printf("%.1f ", b[i]);
}
printf("\n");
printf("%d\n", ost);
printf("%d\n", n);
}
//
MPI_Bcast(a,n,MPI_DOUBLE,0,MPI_COMM_WORLD);
MPI_Bcast(b,n,MPI_DOUBLE,0,MPI_COMM_WORLD);
MPI_Bcast(c,n,MPI_DOUBLE,0,MPI_COMM_WORLD);
start = MPI_Wtime(); //
for (int i = nom*(n/kol); i < (nom + 1)*(n/kol); i++)
{
c[i] = a[i] + b[i];
}
for (int i = 0; i < ost; i++)
{
if (nom == i)
{
c[n - ost + i] = a[n - ost + i] + b[n - ost + i];
}
}
finish = MPI_Wtime();
MPI_Reduce(c,c1,n,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
if (nom == 0)
{
for (int i = 0; i < n; i++)
{
// printf("%.1f ", c1[i]);
}
duration = finish - start;
printf("Parallel=%f \n", duration);
|
|
printf("\n");
}
t1 = clock();
for (int i = 0; i < n; i++)
{
c[i] = a[i] + b[i];
}
t2 = clock();
td = (t2-t1)/double(CLOCKS_PER_SEC);
printf("Posl=%f \n", td);
MPI_Finalize();
return 0;
}
1.
- | - / | (T1), | (Tp), | (Sp) | (Ep) |
0,003 | 0,001144 | 2,62 | 1,31 | ||
0,005 | 0,001023 | 4,88 | 1,22 | ||
0,11 | 0,005948 | 18,49 | 3,082 |
: , , . , .