diff --git a/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp b/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp index ac1c580..1aff259 100644 --- a/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp +++ b/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp @@ -11,14 +11,11 @@ void array_alloc(long **&arr, long arrsize) { try { - arr = new long* [arrsize]; - - + arr = new long* [arrsize]; arr[0] = new long [arrsize*arrsize]; for(long i = 1; i < arrsize; ++i) arr[i] = arr[i-1] + arrsize; - } catch (bad_alloc& ex) { @@ -31,8 +28,7 @@ void vect_alloc(long *&arr, long arrsize) { try { - arr = new long [arrsize]; - + arr = new long [arrsize]; } catch (bad_alloc& ex) { @@ -49,15 +45,13 @@ void array_destroy(long **arr) int main(int argc, char *argv[]) { - long **A=NULL, **B=NULL, **C=NULL, *B_rot=NULL, *vect=NULL, *vect_c=NULL; - long rozmiar=0; + long **A=NULL, **B=NULL, **C=NULL, *B_rot=NULL, *vect=NULL, *vect_c=NULL, *C_rot=NULL; + long rozmiar=0, porcja_new=0; char *endptr; TTiming tt; - long i, j;//,k; + long i; MPI::Status status; - - if (argc < 2) { cerr << "Usage: " << argv[0] << " " << endl; @@ -78,11 +72,10 @@ int main(int argc, char *argv[]) exit(1); } - MPI::Init(argc, argv); + MPI::Init(argc, argv); int taskid = MPI::COMM_WORLD.Get_rank(); int ntasks = MPI::COMM_WORLD.Get_size(); - printf("ntasks= %d : taskid= %d : Hello World!\n",ntasks,taskid); //alokacja macierzy array_alloc(A, rozmiar); @@ -90,25 +83,33 @@ int main(int argc, char *argv[]) { array_alloc(B, rozmiar); vect_alloc(B_rot, rozmiar*rozmiar); + vect_alloc(C_rot, rozmiar*rozmiar); } - int porcja = (rozmiar*rozmiar)/ntasks + (rozmiar*rozmiar)%ntasks; + // porcja - ile wektorów dostaje jeden proces do liczenia + // jeżeli liczba procesów większa od wektorów - każdy proces dostaje po jednym, niektóre wcale + long porcja = (rozmiar>=ntasks) ? (long)round(rozmiar*1.0/ntasks) : 1; + porcja *= rozmiar; //porcję mnożymy przez ilość elementów w jednym wektorze + porcja_new = porcja; + array_alloc(C, rozmiar); vect_alloc(vect, porcja); vect_alloc(vect_c, porcja); if (taskid == 0) { - //wypelnienie macierzy A liczbami "losowymi" + // wypełnienie macierzy A liczbami "losowymi" for (long i=0; i=ntasks) ? 0 : ntasks-rozmiar); + // + // część licząca --------------------------------------------------------------------------------- + // + if (taskid == 0) + tt.Begin(); + + if (taskid == ntasks -1) //przelicz porcję dla ostatniego procesu (w przypadku dzielenia z resztą) + { + porcja_new = (rozmiar - (porcja/rozmiar)*(ntasks-1))*rozmiar; + + // myk jest taki, że muszę podać jakąś niezerową porcję do gathera, + // mimo, że proces nie ma żadnych (sensownych) danych do przetworzenia + if (porcja_new > 0) + porcja = porcja_new; + } + + for (i=0; i