1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
#include <iostream>
#include <cmath>
#include <mpi.h>
#include <fstream>
#include <ctime>
#include <vector>
#define n 16
int rank, size;
//void GaussianElimination(double **,double *b ,double *y);
int main(int argc, char * argv[])
{
double sTime, eTime, rTime;
std::ifstream inFile;
int num_rows = 4;
int num_cols = 4;
int num_processors =4;
int cur_control = 0;
double * send_buffer = NULL;
double * recv_buffer = NULL;
double ** data = NULL;
double determinant;
int irow =0; int icol=0; int iIndex =0;
std::vector<double> file_buffer;
double **M_A, *I_A, *I_B, *I_Y, *ARecv, *BRecv;
double *Output, Pivot;
I_B = NULL;
I_B = new double[n];
if(I_B == NULL){
std::cout<< " I_A can't be allocated memory";
return -2;
}
I_A = NULL;
I_A = new double[n];
if(I_A == NULL){
std::cout<< " I_A can't be allocated memory";
return -2;
}
I_Y = NULL;
I_Y = new double[n];
if(I_Y== NULL){
std::cout<< " I_Y can't be allocated memory";
return -2;
}
recv_buffer = new double[n];
if(recv_buffer== NULL){
std::cout<< " recv_buffer can't be allocated memory";
return -2;
}
M_A = new double*[num_cols];
for(int i = 0; i < num_cols; i++){
M_A[i] = new double[num_rows];
if(M_A[i]==NULL){
std::cout<<"M_A can't be allocated";
MPI_Finalize();
return 0;
}
}
for(int i = 0; i < num_cols; i++)
{
for(int j = 0; j < num_rows; j++)
M_A[i][j] = 0;
}
// Just get the initialization of the program going.
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(!rank)
{ M_A[0][0] =2.0;M_A[0][1] =1.0; M_A[0][2] = -1.0; M_A[0][3] =2.0; //A[0][3] = 12.0;
M_A[1][0] =4.0;M_A[1][1] =5.0; M_A[1][2] =-3.0; M_A[1][3] = 6.0;//A[1][3] = 0.0;
M_A[2][0] =-2.0;M_A[2][1] =5.0; M_A[2][2] = -2.0; M_A[2][3]=6.0;//A[0][3] = -9;
M_A[3][0] =4.0;M_A[3][1] =11.0; M_A[3][2] = -4.0; M_A[3][3]=8.0;//A[0][3] = -9;
I_B[0] = 5; I_B[1] = 9; I_B[2] = 4; I_B[3]=2;
for(irow=0; irow<num_rows; irow++)
for(icol=0; icol<num_cols; icol++)
I_A[iIndex++] = M_A[irow][icol];
}
MPI_Bcast (&num_rows, 1, MPI_INT, 0, MPI_COMM_WORLD);
int iChunkSize = num_rows/num_processors;
MPI_Scatter(send_buffer, num_cols, MPI_DOUBLE, recv_buffer, num_cols, MPI_DOUBLE, 0, MPI_COMM_WORLD);//data goes to each process
/*for(int i=0;i<num_rows;i++)
{
MPI_Bcast((int **)&(M_A[i][0]),num_rows,MPI_INT,0,MPI_COMM_WORLD);
}*/
if(rank!=0) {
for (int i= 0; i <num_rows;i++)
{
std::cout<<recv_buffer[i];
printf("\n");
}
}
// MPI_Barrier(MPI_COMM_WORLD);*/
delete [] I_Y;
delete [ ]I_B;
for(int i = 0; i < n; i++)
delete [] M_A[i];
delete [ ] M_A;// No need to delete A because A is not created dynamically
MPI_Finalize();
return 0;
}
| |