     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_parallel_per_row: %g ms.\nVerifying transpose...%s\n", timer.Elapsed(), compare_matrices(mat_new, mat_gold) ? "Failed" : "Success");
+    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");

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

    free(mat);
    free(mat_gold);


    }
}

__global__ transpose_parallel_row(float* mat, float* mat_new){
    int i = threadIdx.x;

    for (int j = 0; j < N; j++){
        mat_new[j+i*N] = mat[i+j*N];
    }
}

int main(int argc, char const *argv[])
{
    size_t mat_size = N * N * sizeof(float);
