Page MenuHomec4science

multMPI.cpp
No OneTemporary

File Metadata

Created
Sun, Jul 6, 11:16

multMPI.cpp

#include <iostream>
#include <string>
#include <random>
#include <string>
#include <chrono>
#include <cstdlib>
#include <chrono>
#include <mpi.h>
#include <vector>
using namespace std;
void multiply(double *matrix,double *vec,double *result,int cols,int start,int end){
int counter=0;
for(int i=start;i<end;i++){
double sum=0;
for(int j=0;j<cols;j++){
sum+=matrix[i*cols+j]*vec[j];
}
result[counter]=sum;
counter++;
}
}
void displacement(int size,int *scounts,int *displs){
int d=0;
for (int i=0; i<size; ++i) {
displs[i]=d;
d=d+scounts[i];
}
}
//size=num processes
void sizeCounts(int n,int size,int *scounts){
int equalWork=n/size;
int remainder=n-equalWork*size;
for(int i=0;i<size;++i){
if(remainder>0){
scounts[i]=equalWork+1;
remainder-=1;
} else{
scounts[i]=equalWork;
}
}
}
void matrVecMultiply(int cols,int rank,double *matrix,double *vec,int *sc,int *displ,double *allValues){
int start=displ[rank];
int end=displ[rank]+sc[rank];
double result[end-start+1];
multiply(matrix,vec,result,cols,start,end);
//double allValues[cols];
MPI_Gatherv(result,sc[rank], MPI_DOUBLE,
allValues, sc, displ,
MPI_DOUBLE,0, MPI_COMM_WORLD);
}
int main(){
MPI::Init();
int rows=1000;
int cols=rows;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
double matrix[rows*cols];
double vec[rows];
//give some initial values
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
matrix[j+cols*i]=j+cols*i;
}
vec[i]=i;
}
clock_t begin = clock();
int sc[size];
sizeCounts(rows,size,sc);
int disp[size];
displacement(size,sc,disp);
double result[cols];
for(int a=0;a<1000;a++){
matrVecMultiply(cols,rank,matrix,vec,sc,disp,result);
}
clock_t end = clock();
if(rank==0){
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
printf("wall clock time (clock_t) = %.4gs\n", elapsed_secs);
}
/*
//cout<<"\n\n";
for(int i=0;i<rows;i++){
//cout<<result[i]<<" ";
}
*/
MPI::Finalize();
return 0;
}

Event Timeline