diff --git a/src/Makefile b/src/Makefile index 155d867b41d7b2cfd579f0959d17938145a527c3..a4eefda9d85f2267223b27af0e071049ae633546 100644 --- a/src/Makefile +++ b/src/Makefile @@ -26,10 +26,10 @@ LDOPT = -lginac $(TAULIB) MPIEXEC = mpiexec NP = 5 -MPISRC = masterworker.cpp \ +MPISRC = masterworker.cpp mw_addslave.cpp \ perf.cpp sequential.cpp tensormatrix_mpi.cpp \ utils.cpp utils_parall.cpp profiling.cpp -#mw_combined.cpp mw_addslave.cpp hierarchical.cpp +#mw_combined.cpp hierarchical.cpp MPIOBJ= $(MPISRC:.cpp=.o) diff --git a/src/masterworker.cpp b/src/masterworker.cpp index 90ac1b3590467818ebbb9daf73123fa67d144be4..2bfccc3e2e8e456016fefd42a9a1cd1508403b8b 100644 --- a/src/masterworker.cpp +++ b/src/masterworker.cpp @@ -54,7 +54,6 @@ gi::ex multiply_1level_master( tensor3D_t& T, unsigned int size, MPI_Comm comm = } } } - /* Compute the set of symbols */ /* Could be done while the first slave is working */ diff --git a/src/mw_addslave.cpp b/src/mw_addslave.cpp index f35e47a2e49edb6951e3cf146287a3a8179d9f51..d74de64ce288d77235cf31fbca10f5f2d28492d2 100644 --- a/src/mw_addslave.cpp +++ b/src/mw_addslave.cpp @@ -15,9 +15,9 @@ namespace gi = GiNaC; * Parallel 1-level decomposition with addition on a slave * *******************************************************************************/ -gi::ex multiply_1level_master_addslave( tensor3D_t& T, matrix_int_t& J, unsigned int size, MPI_Comm comm = MPI_COMM_WORLD ) { +gi::ex multiply_1level_master_addslave( tensor3D_t& T, unsigned int size, MPI_Comm comm = MPI_COMM_WORLD ) { gi::ex Tens = 0; - unsigned int a1, a2, a3, b1; + unsigned int a1, a2, a4; gi::ex A; gi::lst symbols; @@ -37,24 +37,22 @@ gi::ex multiply_1level_master_addslave( tensor3D_t& T, matrix_int_t& J, unsigned j = 0; int receivedresults = 0; + unsigned int N = size/2; std::vector<parameters_t> input; std::vector<std::string> results; /* length and char* */ /* Build a list of argument sets */ - for( a1 = 0 ; a1 < size; a1++ ){ + for( a4 = 0 ; a4 < N ; a4++ ){ i=i+1; - for( a2 = 0; a2 < size ; a2++ ){ - j=j+1; - for( a3 = 0 ; a3 < size ; a3++ ){ - A = T[a1][a2][a3]; - for( b1 = 0 ; b1 < size ; b1++ ){ - parameters_t p( A, a1, a2, a3, b1 ); - input.push_back( p ); - } - } - } + for( a2 = 0; a2 < N ; a2++ ){ + j=j+1; + for( a1 = 0 ; a1 < N ; a1++ ){ + parameters_t p( a4, a2, a1 ); + input.push_back( p ); + } + } } /* Compute the set of symbols */ @@ -137,9 +135,9 @@ gi::ex multiply_1level_master_addslave( tensor3D_t& T, matrix_int_t& J, unsigned return Tens; } -void multiply_1level_slave_addslave( tensor3D_t& T, matrix_int_t& J, unsigned int size, MPI_Comm comm = MPI_COMM_WORLD ) { +void multiply_1level_slave_addslave( tensor3D_t& T, unsigned int size, MPI_Comm comm = MPI_COMM_WORLD ) { gi::ex Tens; - int a1, a2, a3, b1; + int a1, a2, a4; // gi::ex A; unsigned int len = 0; @@ -164,13 +162,11 @@ void multiply_1level_slave_addslave( tensor3D_t& T, matrix_int_t& J, unsigned in MPI_Recv( ¶ms, 1, DT_PARAMETERS, ROOT, MPI_ANY_TAG, comm, &status ); if( status.MPI_TAG == TAG_WORK ){ - a1 = params.a1; + a4 = params.a4; a2 = params.a2; - a3 = params.a3; - b1 = params.b1; - gi::symbol A( std::string( params.A ) ); + a1 = params.a1; - Tens = one_level1_product( &T, &J, A, size, a1, a2, a3, b1 ); + Tens = one_level1_product( &T, size, a4, a2, a1 ); send_result( Tens ); } else { @@ -178,7 +174,7 @@ void multiply_1level_slave_addslave( tensor3D_t& T, matrix_int_t& J, unsigned in /* Receive a set of expressions to add */ /* Number of expressions received */ - int nb = params.a1; + int nb = params.a4; /* Length of each string */ @@ -221,7 +217,7 @@ void multiply_1level_slave_addslave( tensor3D_t& T, matrix_int_t& J, unsigned in W -> M: send an unsigned int (size of the expression), then the expression (table of chars) */ -gi::ex multiply_1level_mw_addslave( tensor3D_t& T, matrix_int_t& J, int size ) { // simpler: same dimension everywhere +gi::ex multiply_1level_mw_addslave( tensor3D_t& T, int size ) { // simpler: same dimension everywhere int rank; gi::ex Tens = 0; MPI_Comm_rank( MPI_COMM_WORLD, &rank ); @@ -233,9 +229,9 @@ gi::ex multiply_1level_mw_addslave( tensor3D_t& T, matrix_int_t& J, int size ) { /* Here we go */ if( 0 == rank ) { - Tens = multiply_1level_master_addslave( T, J, size ); + Tens = multiply_1level_master_addslave( T, size ); } else { - multiply_1level_slave_addslave( T, J, size ); + multiply_1level_slave_addslave( T, size ); } /* Finalize */ diff --git a/src/tensormatrix.h b/src/tensormatrix.h index 069744c68a7556275e7c8b6fc437a1c9ed57d852..5f471ded12bcb98d474b8a8f59c7af794dc58528 100644 --- a/src/tensormatrix.h +++ b/src/tensormatrix.h @@ -24,7 +24,7 @@ gi::ex multiply_1level( tensor3D_t&, matrix_int_t&, int ); gi::ex multiply_2levels( tensor3D_t&, matrix_int_t&, int ); // parallel gi::ex multiply_1level_mw( tensor3D_t&, int ); -gi::ex multiply_1level_mw_addslave( tensor3D_t&, matrix_int_t&, int ); +gi::ex multiply_1level_mw_addslave( tensor3D_t&, int ); gi::ex multiply_1level_mw_hierarch( tensor3D_t&, matrix_int_t&, int ); gi::ex multiply_combined( tensor3D_t&, matrix_int_t&, int ); diff --git a/src/tensormatrix_mpi.cpp b/src/tensormatrix_mpi.cpp index f62251d9cec2a4de8e5f1505bd9f43419ed1821f..f1aa1dd9581bece858df7c35f480d652b6c196e8 100644 --- a/src/tensormatrix_mpi.cpp +++ b/src/tensormatrix_mpi.cpp @@ -134,10 +134,10 @@ int main( int argc, char** argv ){ case 'm': Tpara = multiply_1level_mw( T, N ); break; - /* case 'a': - Tpara = multiply_1level_mw_addslave( T, J, N ); + case 'a': + Tpara = multiply_1level_mw_addslave( T, N ); break; - case 'h': + /*case 'h': Tpara = multiply_1level_mw_hierarch( T, J, N ); break; case 'c': diff --git a/src/utils_parall.cpp b/src/utils_parall.cpp index 0490e7d8bc8e013452fddfefb7888e278bd1ae02..6a1278b2d99e566f76f52b23ebf6594ed36f4922 100644 --- a/src/utils_parall.cpp +++ b/src/utils_parall.cpp @@ -98,7 +98,7 @@ void send_expressions_to_add( std::vector<std::string>& results, int peer ) { /* Fill a bogus parameter object */ int nb = results.size(); int i; - parameters_t p( 0, 0, 0 ); + parameters_t p( nb, 0, 0 ); char* expr; MPI_Send( &p, 1, DT_PARAMETERS, peer, TAG_ADD, MPI_COMM_WORLD ); @@ -115,7 +115,7 @@ void send_expressions_to_add( std::vector<std::string>& results, int peer ) { expr = const_cast<char*>( results[i].c_str() ); MPI_Send( expr, results[i].length(), MPI_CHAR, peer, TAG_ADD, MPI_COMM_WORLD ); } - + results.erase( results.begin(), results.end() ); free( lengths );