 }
 
 
-
+// Estimates 
+// maxFrac : 
+// nr_rows :
+// nr_cols :
 int estimateMaxGPUAllocation(double maxFrac, int nr_rows, int nr_cols) {
   size_t free_byte ;
   size_t total_byte ;

  sizeOfArray = (INT64L * minSize) / ownLimbSize;
  if ((INT64L * minSize) % ownLimbSize != 0) sizeOfArray += 1;
}


// All arrays need to already have allocated memory: 

// *d_aS: array allocated in GPU with size sizeOfArray * nr_rowsA * nr_colsA. Note that we flatten this               
//        array of matrices in order to speed up the access in the GPU.                                              
//        Thus, to access the k-th limb from the (i, j) matrix entry one calls d_aS[k * nr_rowsA * nr_colsA + j * nr_rowsA + i]
// *d_bS: array allocated in GPU with size sizeOfArray * nr_colsA * nr_colsB. Note that we flatten this                                         
//        array of matrices in order to speed up the access in the GPU.                                                                          
//        Thus, to access the k-th limb from the (i, j) matrix entry one calls d_bS[k * nr_colsA * nr_colsB + j * nr_colsA + i] 
// *tmpTransferLongToGMP : temporary array of doubles used for transfers that needs max(nr_rowsA * nr_colsA, nr_colsA * nr_colsB) entries        
// *tmp: temporary array of 64-bit vars used for transfers. Needs to be allocated nr_rowsA * nr_colsB entries
// *d_prodRes: temporary matrix allocated in GPU memory which handles individual multiplications of matrices
// *d_res : temporary matrix allocated in GPU memory in which we sum up all individual multiplications of matrices
