         double elapsed = (end - start) / (double) CLOCKS_PER_SEC;
         printf("Computation time in the CPU: %f seconds\n", elapsed);
 	
+
+	cuda_mat_mul();	
 	copyMatricesToGPU();
-	kernel <<< 32, 32 >>>  (A_GPU, B_GPU, C_GPU);
+	dim3 dimBlock(BLOCK_SIZE,BLOCK_SIZE);
+	// width of b / BS, height of A / BS
+	dim3 dimGrid(B_MD.dimension1/ BLOCK_SIZE, A_MD.dimesion2 / BLOCK_SIZE);
+	kernel <<< dimGrid, dimBlock >>>  (A_GPU, B_GPU, C_GPU, A_MD, B_MD);
 
 	return 0;
 }

	}
}

__global__ void kernel(float * A_GPU, float * B_GPU, float * C_GPU) {
	int srow = 0;
	int scol = 0;
	int threadId = blockDim.x * blockIdx.x + threadIdx.x;

//----------------------------------- host function definitions -----------------------------------------

void allocateAndInitializeAB();
void computeCpuMMM();/
void copyMatricesToGPU();
void copyResultFromGPU();
void compareHostAndGpuOutput();
void die(const char *error); 
void check_error(cudaError e);
__global__ void kernel(float * A_GPU, float * B_GPU, float * C_GPU, ArrayMetaData2D A_gpu_md, ArrayMetaData2D B_gpu_md);
//----------------------------------- CUDA function definitions -----------------------------------------

#define BLOCK_SIZE 10

//-------------------------------------------------------------------------------------------------------
int main(int argc, char **argv) {
