[arrayfire] 10/29: Fixed several memory leaks in CUDA and OpenCL SIFT

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Mon Oct 19 17:48:53 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch master
in repository arrayfire.

commit 43810d52b10b9b2b4b14589396a87e47c2f1cde5
Author: Peter Andreas Entschev <peter at arrayfire.com>
Date:   Mon Oct 5 17:00:07 2015 -0400

    Fixed several memory leaks in CUDA and OpenCL SIFT
---
 src/backend/cuda/kernel/sift_nonfree.hpp   |  8 ++++----
 src/backend/opencl/kernel/sift_nonfree.hpp | 16 +++++++++++++++-
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/backend/cuda/kernel/sift_nonfree.hpp b/src/backend/cuda/kernel/sift_nonfree.hpp
index 1a1c35f..43438e9 100644
--- a/src/backend/cuda/kernel/sift_nonfree.hpp
+++ b/src/backend/cuda/kernel/sift_nonfree.hpp
@@ -1181,6 +1181,10 @@ void sift(unsigned* out_feat,
                     contrast_thr, edge_thr, init_sigma, img_scale);
         POST_LAUNCH_CHECK();
 
+        memFree(d_extrema_x);
+        memFree(d_extrema_y);
+        memFree(d_extrema_layer);
+
         CUDA_CHECK(cudaMemcpy(&interp_feat, d_count, sizeof(unsigned), cudaMemcpyDeviceToHost));
         interp_feat = min(interp_feat, max_feat);
 
@@ -1218,10 +1222,6 @@ void sift(unsigned* out_feat,
         apply_permutation<float>(interp_y_ptr, permutation);
         apply_permutation<float>(interp_x_ptr, permutation);
 
-        memFree(d_extrema_x);
-        memFree(d_extrema_y);
-        memFree(d_extrema_layer);
-
         float* d_nodup_x = memAlloc<float>(interp_feat);
         float* d_nodup_y = memAlloc<float>(interp_feat);
         unsigned* d_nodup_layer = memAlloc<unsigned>(interp_feat);
diff --git a/src/backend/opencl/kernel/sift_nonfree.hpp b/src/backend/opencl/kernel/sift_nonfree.hpp
index bc65516..9aee907 100644
--- a/src/backend/opencl/kernel/sift_nonfree.hpp
+++ b/src/backend/opencl/kernel/sift_nonfree.hpp
@@ -172,7 +172,6 @@ Param gaussFilter(float sigma)
     dim_t gauss_elem = gauss_filter.info.strides[3] * gauss_filter.info.dims[3];
     gauss_filter.data = bufferAlloc(gauss_elem * sizeof(T));
     getQueue().enqueueWriteBuffer(*gauss_filter.data, CL_TRUE, 0, gauss_elem * sizeof(T), h_gauss);
-    getQueue().enqueueWriteBuffer(*gauss_filter.data, CL_TRUE, 0, gauss_elem * sizeof(T), h_gauss);
 
     delete[] h_gauss;
 
@@ -538,6 +537,10 @@ void sift(unsigned* out_feat,
                  contrast_thr, edge_thr, init_sigma, img_scale);
             CL_DEBUG_FINISH(getQueue());
 
+            bufferFree(d_extrema_x);
+            bufferFree(d_extrema_y);
+            bufferFree(d_extrema_layer);
+
             getQueue().enqueueReadBuffer(*d_count, CL_TRUE, 0, sizeof(unsigned), &interp_feat);
             interp_feat = min(interp_feat, extrema_feat);
 
@@ -643,6 +646,12 @@ void sift(unsigned* out_feat,
                  cl::Local(OriHistBins * SIFT_THREADS_Y * 2 * sizeof(float)));
             CL_DEBUG_FINISH(getQueue());
 
+            bufferFree(d_nodup_x);
+            bufferFree(d_nodup_y);
+            bufferFree(d_nodup_layer);
+            bufferFree(d_nodup_response);
+            bufferFree(d_nodup_size);
+
             getQueue().enqueueReadBuffer(*d_count, CL_TRUE, 0, sizeof(unsigned), &oriented_feat);
             oriented_feat = min(oriented_feat, max_oriented_feat);
 
@@ -695,6 +704,11 @@ void sift(unsigned* out_feat,
 
         bufferFree(d_count);
 
+        for (size_t i = 0; i < gauss_pyr.size(); i++)
+            bufferFree(gauss_pyr[i].data);
+        for (size_t i = 0; i < dog_pyr.size(); i++)
+            bufferFree(dog_pyr[i].data);
+
         // If no features are found, set found features to 0 and return
         if (total_feat == 0) {
             *out_feat = 0;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/arrayfire.git



More information about the debian-science-commits mailing list