From ad5598408daf5e913a99d3ce9ee0aeac159babc3 Mon Sep 17 00:00:00 2001 From: Piotr Dergun Date: Thu, 3 Nov 2016 11:00:32 +0100 Subject: [PATCH] poprawki na wysypujacy sie bufor --- DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp b/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp index 79bfd81..033b3e6 100644 --- a/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp +++ b/DergunPiotr-WaskoDominik/zad2/macierz_mpi.cpp @@ -46,7 +46,7 @@ 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, *C_rot=NULL; - long rozmiar=0, porcja_new=0; + long rozmiar=0, porcja_new=0, buff_max=0; char *endptr; TTiming tt; long i; @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) { array_alloc(B, rozmiar); vect_alloc(B_rot, rozmiar*rozmiar); - vect_alloc(C_rot, rozmiar*rozmiar); + } // porcja - ile wektorów dostaje jeden proces do liczenia @@ -91,10 +91,20 @@ int main(int argc, char *argv[]) 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; + + // dla kompatybilności liczę jeszcze rozmiar bufora odbioru, + // np. jeżeli chunki będą jednolitego rozmiaru, a ostatni będzie większy + // to bufor odbioru musi być zwiększony (żeby go nie ucinało) + buff_max = (rozmiar - (porcja/rozmiar)*(ntasks-1))*rozmiar; + if (porcja > buff_max) + buff_max = porcja; // na wypadek, jeżeli jednak ostatni kawałek będzie mniejszy + if (taskid == 0) + vect_alloc(C_rot, ntasks*buff_max); + array_alloc(C, rozmiar); vect_alloc(vect, porcja); - vect_alloc(vect_c, porcja); + vect_alloc(vect_c, buff_max); if (taskid == 0) { // wypełnienie macierzy A liczbami "losowymi" @@ -125,7 +135,7 @@ int main(int argc, char *argv[]) cout << endl; } MPI::COMM_WORLD.Barrier(); - + //dla wszystkich lub "rozmiar" procesów należy zadać porcję do obliczenia MPI::COMM_WORLD.Scatter(&B_rot[0], porcja, MPI::LONG, &vect[0], porcja, MPI::LONG,0);// (rozmiar>=ntasks) ? 0 : ntasks-rozmiar); @@ -167,7 +177,7 @@ int main(int argc, char *argv[]) } // zwróć wszystko do programu głównego - MPI::COMM_WORLD.Gather(&vect_c[0], porcja, MPI::LONG, &C_rot[0], porcja, MPI::LONG, 0); + MPI::COMM_WORLD.Gather(&vect_c[0], buff_max, MPI::LONG, &C_rot[0], buff_max, MPI::LONG, 0); if (taskid == 0 && false) { @@ -189,4 +199,4 @@ int main(int argc, char *argv[]) MPI::Finalize(); exit(0); -} \ No newline at end of file +}