#include #include #include #include #include "q2matrixmultiply.h" using namespace std; int main( int argc, char * argv[] ) { intmax_t xrows, xycols, ycols, processors = 1; istream *xfile = nullptr, *yfile = nullptr; // x, y matrix files bool IO = false; try { if ( argc < 4 || argc > 6 ) throw 1; // minimum arguments switch ( argc ) { case 6: try { yfile = new ifstream( argv[5] ); } catch( uFile::Failure & ) { // open failed ? cerr << "Error! Cannot open y-matrix input-file \"" << argv[5] << "\"" << endl; throw 1; } // try try { xfile = new ifstream( argv[4] ); } catch( uFile::Failure & ) { // open failed ? cerr << "Error! Cannot open x-matrix input-file \"" << argv[4] << "\"" << endl; throw 1; } // try IO = true; // print goto getdim; case 5: processors = convert( argv[4] ); if ( processors <= 0 ) throw 1; // invalid integer ? // FALL THROUGH case 4: getdim: ycols = convert( argv[3] ); if ( ycols <= 0 ) throw 1; // invalid integer ? // FALL THROUGH case 3: xycols = convert( argv[2] ); if ( xycols <= 0 ) throw 1; // invalid integer ? // FALL THROUGH case 2: xrows = convert( argv[1] ); if ( xrows <= 0 ) throw 1; // invalid integer ? // FALL THROUGH } // switch } catch( ... ) { cerr << "Usage: " << argv[0] << " xrows (> 0) xycols (> 0) ycols (> 0) [ processors (> 0) | x-matrix-file y-matrix-file ]" << endl; exit( EXIT_FAILURE ); // TERMINATE } // try int r, c; int * Z[xrows], * X[xrows], * Y[xycols]; for ( r = 0; r < xrows; r += 1 ) { // create/initialize X matrix X[r] = new int[xycols]; for ( c = 0; c < xycols; c += 1 ) { if ( IO ) *xfile >> X[r][c]; else X[r][c] = 37; // for timing } // for } // for for ( r = 0; r < xycols; r += 1 ) { // create/initialize Y matrix Y[r] = new int[ycols]; for ( c = 0; c < ycols; c += 1 ) { if ( IO ) *yfile >> Y[r][c]; else Y[r][c] = 37; // for timing } // for } // for for ( r = 0; r < xrows; r += 1 ) { // create Z matrix Z[r] = new int[ycols]; } // for uProcessor p[processors - 1]; // set processors used (have one CPU already) matrixmultiply( Z, X, xrows, xycols, Y, ycols ); // Z_xr,yc = X_xr,c * Y_c,yc if ( IO ) { unsigned int width = 8; for ( r = 0; r < xycols; r += 1 ) { cout << setw(8 * xycols + 3) << "" << "| "; // print X separator for ( c = 0; c < ycols; c += 1 ) { // print Y matrix cout << setw(width) << Y[r][c]; } // for cout << endl; } // for cout << setfill('-'); cout << setw(8 * xycols + 3) << "" << '*'; // print separator line cout << setw(8 * ycols + 1) << ""; cout << setfill(' ') << endl; for ( r = 0; r < xrows; r += 1 ) { for ( c = 0; c < xycols; c += 1 ) { // print X matrix cout << setw(width) << X[r][c]; } // for cout << " | "; for ( c = 0; c < ycols; c += 1 ) { // print Z matrix cout << setw(width) << Z[r][c]; } // for cout << endl; } // for } // if for ( r = 0; r < xrows; r += 1 ) { // deallocate X matrix delete [] X[r]; delete [] Z[r]; } // for for ( r = 0; r < xycols; r += 1 ) { // deallocate Y matrix delete [] Y[r]; } // for if ( yfile != nullptr ) delete yfile; // close files if specified if ( xfile != nullptr ) delete xfile; } // main