diff --git a/src/mw_addslave4.cpp b/src/mw_addslave4.cpp index 6505442f42420464e48f0f0db1eed22b19ada348..07b78de2421b829aedd61037d7571d637ee054fb 100644 --- a/src/mw_addslave4.cpp +++ b/src/mw_addslave4.cpp @@ -77,27 +77,35 @@ gi::ex add_expressions_parall( std::vector<std::string> expressions, gi::lst sym for( auto s: expressions ) { chunk = ceil( s.length() / size ); + end = 0; for( peer = 0 ; peer < size ; peer++ ) { if( 0 == peer ) { - displ[ expr ] = 0; + displ[ peer * nb + expr] = 0; end = chunk; } else { + displ[ peer * nb + expr] = end + 1; end = displ[ peer * nb + expr] + chunk; } /* How much are we going to send: stop at a + or - sign (and keep the sign) */ - while( !( s[end] == '+' || s[end] == '-' || end == (int)s.length() - 1) ){ + while( ( end < (int)s.length() - 1) && !( s[end] == '+' || s[end] == '-' || end == (int)s.length() - 1 )) { end++; } end--; + // std::cout << s[end-4] << s[end-3] << s[end-2] << s[end-1] << s[end] << std::endl; if( 0 == peer ) { lengths[ expr ] = end + 1; } else { // std::cout << "peer " << peer << " expr " << expr << " end " << end << std::endl; lengths[ peer * nb + expr ] = end - displ[ peer * nb + expr ] + 1; } - if( peer < size - 1 ) displ[ ( peer + 1 ) * nb + expr] = end; + // if( peer < size - 1 ) displ[ ( peer + 1 ) * nb + expr] = end; + + // std::cout << "Disp " << displ[ peer * nb + expr] << std::endl; + // std::cout << s << std::endl; + // std::cout << s[ displ[ peer * nb + expr] ] << s[ displ[ peer * nb + expr] + 1 ] << s[ displ[ peer * nb + expr] + 2 ] << s[ displ[ peer * nb + expr] + 3 ] << s[ displ[ peer * nb + expr] + 4 ] << std::endl; + } expr++; @@ -171,13 +179,22 @@ gi::ex add_expressions_parall( std::vector<std::string> expressions, gi::lst sym expr_c[len ] = '\0'; // The master sends C++ strings, which do not contain the final '\0' results_s.push_back( std::string( expr_c ) ); + // if( rank == 0 ){ + // for( peer = 0 ; peer < size ; peer++ ) { + // std::cout << "==" << toto[ m_disp[peer] ] << toto[ m_disp[peer] +1] << toto[ m_disp[peer] +2] << toto[ m_disp[peer] +3] << toto[ m_disp[peer] +4] << std::endl; + // } + // } + + // std::cout << expr_c << std::endl; + /* TODO: this can be overlapped with the computation of the previous addition */ } /* Add them */ Tens = add_expressions( results_s, symbols ); - + // std::cout << Tens << std::endl; + /* Send the result to the master */ std::string expr_s = linearize_expression( Tens ); @@ -187,28 +204,33 @@ gi::ex add_expressions_parall( std::vector<std::string> expressions, gi::lst sym if( 0 == rank ) { for( peer = 0 ; peer < size ; peer++ ){ - m_disp[peer] = totallen; + m_disp[peer] = totallen + 1; totallen += m_len[peer]; } + m_disp[0] = 0; total_c = (char*) malloc( ( totallen + size ) * sizeof( char ) ); } - + + // sleep( rank ); expr_c = const_cast<char*>( expr_s.c_str() ); - - std::cout << expr_c[ len-5 ] << expr_c[ len-4 ] << expr_c[ len-3 ] << expr_c[ len-2 ] << expr_c[ len-1 ] << std::endl; + // std::cout << rank << " | " << expr_c << std::endl; + + //std::cout << expr_s << std::endl; + // std::cout << expr_c[ len-5 ] << expr_c[ len-4 ] << expr_c[ len-3 ] << expr_c[ len-2 ] << expr_c[ len-1 ] << std::endl; + // std::cout << expr_c[ 0 ] << expr_c[ 1 ] << expr_c[ 2 ] << expr_c[ 3 ] << expr_c[ 4 ] << std::endl; MPI_Gatherv( expr_c, len, MPI_CHAR, total_c, m_len, m_disp, MPI_CHAR, 0, comm ); if( 0 == rank ){ /* replace the \n's by + */ for( peer = 1 ; peer < size ; peer++ ){ - total_c[ m_disp[peer] ] = '+' ; + total_c[ m_disp[peer] - 1 ] = '+' ; } - std::cout << total_c[ totallen-5 ] << total_c[ totallen-4 ] << total_c[ totallen-3 ] << total_c[ totallen-2 ] << total_c[ totallen-1 ] << std::endl; + // std::cout << total_c[ totallen-5 ] << total_c[ totallen-4 ] << total_c[ totallen-3 ] << total_c[ totallen-2 ] << total_c[ totallen-1 ] << std::endl; expr_c[ totallen + size - 1 ] = '\n' ; - // std::cout << total_c << std::endl; + //x std::cout <<"Total: " << total_c << std::endl; - Tens = de_linearize_expression( std::string( total_c ), symbols ); + // Tens = de_linearize_expression( std::string( total_c ), symbols ); } free( lengths );