     transpose_cpu(mat, mat_gold);
     diff = clock() - start;
     int msec = diff * 1000 / CLOCKS_PER_SEC;
-    printf("CPU Transpose time taken %d seconds, %d milliseconds \n", msec/1000, msec%1000);
+    printf("CPU Transpose time taken: %g milliseconds \n", msec/1000, msec%1000);
 
 
     float *d_in, *d_out;

        }
        printf("\n");
    }*/

    free(mat);
    free(mat_gold);


    cudaMemcpy(d_in, mat, mat_size, cudaMemcpyHostToDevice);

    GpuTimer timer;
    
    // transpose serial
    timer.Start();
    transpose_serial<<<1,1>>>(d_in, d_out);
    timer.Stop();

    cudaMemcpy(d_out, mat_new, mat_size, cudaMemcpyDeviceToHost);

    printf("transpose_serial: %g ms.\nVerifying transpose...%s\n", timer.Elapsed(), compare_matrices(mat_new, mat_gold) ? "Failed" : "Success");

    // transpose parallel row
    timer.Start();
    transpose_parallel_row<<<1,N>>>(d_in, d_out);
    timer.Stop();

    cudaMemcpy(d_out, mat_new, mat_size, cudaMemcpyDeviceToHost);

    printf("transpose_parallel_row: %g ms.\nVerifying transpose...%s\n", timer.Elapsed(), compare_matrices(mat_new, mat_gold) ? "Failed" : "Success");


    // show orignal mat, for debug purposes
    /*printf("original_mat: \n");
