/*
 * MatrixMultiplyDemo.java -- run and measure execution time of MatrixMultiply. 
 */

class MatrixMultiplyDemo {
    public static void main(String argv[]) 
	throws java.lang.InterruptedException
    {
	if( argv.length != 3 )
        {
	    System.err.println("Usage:% java MatrixMultiplyDemo matrix-size nthreads niters");
	    System.err.println("Hints: matrix-size: 200..400, nthreads: 1..nCPU, niters: 1..100");
	    System.exit( 1 );
	}
	int matrix_size = Integer.parseInt( argv[0] );
	int nthreads    = Integer.parseInt( argv[1] );
	int niters      = Integer.parseInt( argv[2] );
	run_matrix_multiply_trace( matrix_size, nthreads, niters );
	System.exit( 0 );
    }
    static void run_matrix_multiply_trace( int matrix_size, int nthreads, 
					   int niters )
	throws java.lang.InterruptedException
    {
	// pthread_setconcurrency( nthreads );
	double a[][] = Matrix.alloc( matrix_size, matrix_size );
	double b[][] = Matrix.alloc( matrix_size, matrix_size );
	double c[][] = Matrix.alloc( matrix_size, matrix_size );
	java.util.Random r = new java.util.Random();
	Matrix.fill_rand( a,r );
	Matrix.fill_rand( b,r );
	Matrix.fill_rand( c,r );
	long start = System.currentTimeMillis();
	    for( int i=0; i<niters; i++ )
	    {
		MatrixMultiplyMaster.matrix_multiply_trace( a,b,c,nthreads );
	    }
	long end = System.currentTimeMillis();
	double diff = (double)(end - start)/1000.0 ;
	int concurrency = 0; // pthread_getconcurrency();
	System.out.printf("matrix_size==%d, nthreads==%d, niters==%d, concurrency==%d\n",
	       matrix_size, nthreads, niters, concurrency );
	System.out.printf("%6.3f [sec] / %d [iteration] == %6.3f [sec/iteration]\n",
	       diff, niters, diff/niters );
	System.out.printf("%d [iteration] / %6.3f [sec] == %6.3f [iteration/sec]\n",
	       	niters, diff, niters/diff );
    }
}
