From bd31f59ce78b195bf437980ab28cdf6c478e1ee6 Mon Sep 17 00:00:00 2001
From: "Maxxi (none)" <git@qi0.de>
Date: Wed, 29 Apr 2020 12:53:13 +0200
Subject: [PATCH] Memdebug: count memory allocs

---
 include/clFFT.h     |  2 ++
 src/fft_execute.cpp |  9 ++++++---
 src/fft_internal.h  |  3 +++
 src/fft_setup.cpp   | 24 ++++++++++++++++++++++--
 4 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/include/clFFT.h b/include/clFFT.h
index e1f46aa..527e39f 100644
--- a/include/clFFT.h
+++ b/include/clFFT.h
@@ -194,6 +194,8 @@ cl_int clFFT_1DTwistPlannar(clFFT_Plan Plan, cl_command_queue queue, cl_mem arra
 
 void clFFT_DumpPlan( clFFT_Plan plan, FILE *file);
 
+size_t getMallocSize( void );
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/fft_execute.cpp b/src/fft_execute.cpp
index 79dbf96..7dc7d4c 100644
--- a/src/fft_execute.cpp
+++ b/src/fft_execute.cpp
@@ -79,9 +79,10 @@ allocateTemporaryBufferInterleaved(cl_fft_plan *plan, cl_uint batchSize)
         size_t tmpLength = plan->n.x * plan->n.y * plan->n.z * batchSize * 2 * sizeof(cl_float);
 
         if(plan->tempmemobj)
+            mallocsize -= sizeof(plan->tempmemobj);
             clReleaseMemObject(plan->tempmemobj);
 
-        plan->tempmemobj = clCreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &err);
+        plan->tempmemobj = CreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &err);
     }
     return err;
 }
@@ -97,13 +98,15 @@ allocateTemporaryBufferPlannar(cl_fft_plan *plan, cl_uint batchSize)
         size_t tmpLength = plan->n.x * plan->n.y * plan->n.z * batchSize * sizeof(cl_float);
 
         if(plan->tempmemobj_real)
+            mallocsize -= sizeof(plan->tempmemobj_real);
             clReleaseMemObject(plan->tempmemobj_real);
 
         if(plan->tempmemobj_imag)
+            mallocsize -= sizeof(plan->tempmemobj_imag);
             clReleaseMemObject(plan->tempmemobj_imag);
 
-        plan->tempmemobj_real = clCreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &err);
-        plan->tempmemobj_imag = clCreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &terr);
+        plan->tempmemobj_real = CreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &err);
+        plan->tempmemobj_imag = CreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &terr);
         err |= terr;
     }
     return err;
diff --git a/src/fft_internal.h b/src/fft_internal.h
index 8178374..9775ff7 100644
--- a/src/fft_internal.h
+++ b/src/fft_internal.h
@@ -70,6 +70,7 @@
 
 using namespace std;
 
+extern size_t mallocsize;
 typedef enum kernel_dir_t
 {
     cl_fft_kernel_x,
@@ -186,4 +187,6 @@ typedef struct
 
 void FFT1D(cl_fft_plan *plan, cl_fft_kernel_dir dir);
 
+cl_mem CreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret);
+
 #endif
diff --git a/src/fft_setup.cpp b/src/fft_setup.cpp
index 942e852..40c147c 100644
--- a/src/fft_setup.cpp
+++ b/src/fft_setup.cpp
@@ -76,6 +76,8 @@ using namespace std;
 
 extern void getKernelWorkDimensions(cl_fft_plan *plan, cl_fft_kernel_info *kernelInfo, cl_int *batchSize, size_t *gWorkItems, size_t *lWorkItems);
 
+size_t mallocsize = 0;
+
 static void
 getBlockConfigAndKernelString(cl_fft_plan *plan)
 {
@@ -162,27 +164,32 @@ destroy_plan(cl_fft_plan *Plan)
     }
     if(Plan->tempmemobj)
     {
+      mallocsize -= sizeof(Plan->tempmemobj);
         clReleaseMemObject(Plan->tempmemobj);
         Plan->tempmemobj = NULL;
     }
     if(Plan->tempmemobj_real)
     {
+      mallocsize -= sizeof(Plan->tempmemobj_real);
         clReleaseMemObject(Plan->tempmemobj_real);
         Plan->tempmemobj_real = NULL;
     }
     if(Plan->tempmemobj_imag)
     {
+      mallocsize -= sizeof(Plan->tempmemobj_imag);
         clReleaseMemObject(Plan->tempmemobj_imag);
         Plan->tempmemobj_imag = NULL;
     }
 
     if(Plan->cossin_LUT_d1)
        {
+      mallocsize -= sizeof(Plan->cossin_LUT_d1);
         clReleaseMemObject(Plan->cossin_LUT_d1);
     }
 
     if(Plan->cossin_LUT_d2)
        {
+      mallocsize -= sizeof(Plan->cossin_LUT_d2);
         clReleaseMemObject(Plan->cossin_LUT_d2);
     }
 
@@ -310,7 +317,7 @@ int precomputeSinCosLUTs(cl_fft_plan * plan,cl_int *error_code) {
         tmpLUT_cossin1[i*2]  =(float)cos(PI2 * (float) i / (float)N);
         tmpLUT_cossin1[i*2+1]=(float)sin(PI2 * (float) i / (float)N); 
     } 
-    plan->cossin_LUT_d1 = clCreateBuffer(plan->context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, plan->N1*2*sizeof(float),tmpLUT_cossin1, &err);
+    plan->cossin_LUT_d1 = CreateBuffer(plan->context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, plan->N1*2*sizeof(float),tmpLUT_cossin1, &err);
 
     if( err != CL_SUCCESS) 
     { 
@@ -327,7 +334,7 @@ int precomputeSinCosLUTs(cl_fft_plan * plan,cl_int *error_code) {
         tmpLUT_cossin2[2*i]  =(float)cos(PI2 * (float) i / (float) plan->N2);
         tmpLUT_cossin2[2*i+1]=(float)sin(PI2 * (float) i / (float) plan->N2);
     }
-    plan->cossin_LUT_d2 = clCreateBuffer(plan->context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, plan->N2*2*sizeof(float),tmpLUT_cossin2, &err);
+    plan->cossin_LUT_d2 = CreateBuffer(plan->context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, plan->N2*2*sizeof(float),tmpLUT_cossin2, &err);
     if( err != CL_SUCCESS) 
     { 
       if(error_code)
@@ -526,3 +533,16 @@ void clFFT_DumpPlan( clFFT_Plan Plan, FILE *file)
     }
     fprintf(out, "%s\n", plan->kernel_string->c_str());
 }
+
+
+cl_mem CreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret)
+{
+  cl_mem ret = clCreateBuffer(context, flags, size, host_ptr, errcode_ret);
+  mallocsize += size;
+  return ret;
+}
+
+size_t getMallocSize( void )
+{
+  return mallocsize;
+}
-- 
GitLab