[arrayfire] 140/284: Add memFreeUnlinked to free locked device ptrs

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Sun Feb 7 18:59:27 UTC 2016


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

ghisvail-guest pushed a commit to branch debian/experimental
in repository arrayfire.

commit d02636a4570b17b75a78b7adca6cb83199f57e9f
Author: Shehzan Mohammed <shehzan at arrayfire.com>
Date:   Thu Dec 31 18:21:36 2015 -0500

    Add memFreeUnlinked to free locked device ptrs
---
 src/api/c/device.cpp          |  2 +-
 src/backend/cpu/memory.cpp    | 26 +++++++++++++++++---------
 src/backend/cpu/memory.hpp    |  1 +
 src/backend/cuda/memory.cpp   | 33 ++++++++++++++++++++++++---------
 src/backend/cuda/memory.hpp   |  1 +
 src/backend/opencl/memory.cpp | 32 +++++++++++++++++++++++---------
 src/backend/opencl/memory.hpp |  4 +++-
 7 files changed, 70 insertions(+), 29 deletions(-)

diff --git a/src/api/c/device.cpp b/src/api/c/device.cpp
index 51eb613..c2f21a2 100644
--- a/src/api/c/device.cpp
+++ b/src/api/c/device.cpp
@@ -309,7 +309,7 @@ af_err af_alloc_pinned(void **ptr, const dim_t bytes)
 af_err af_free_device(void *ptr)
 {
     try {
-        memFree<char>((char *)ptr);
+        memFreeUnlinked<char>((char *)ptr, true);
     } CATCHALL;
     return AF_SUCCESS;
 }
diff --git a/src/backend/cpu/memory.cpp b/src/backend/cpu/memory.cpp
index 85ba4f2..0e14450 100644
--- a/src/backend/cpu/memory.cpp
+++ b/src/backend/cpu/memory.cpp
@@ -156,7 +156,7 @@ T* memAlloc(const size_t &elements)
 }
 
 template<typename T>
-void memFree(T *ptr)
+void memFreeUnlinked(T *ptr, bool free_unlinked)
 {
     std::lock_guard<std::mutex> lock(memory_map_mutex);
 
@@ -165,8 +165,9 @@ void memFree(T *ptr)
     if (iter != memory_map.end()) {
 
         iter->second.is_free = true;
-        if ((iter->second).is_unlinked) return;
+        if ((iter->second).is_unlinked && !free_unlinked) return;
 
+        iter->second.is_unlinked = false;
         used_bytes -= iter->second.bytes;
         used_buffers--;
 
@@ -176,6 +177,12 @@ void memFree(T *ptr)
 }
 
 template<typename T>
+void memFree(T *ptr)
+{
+    memFreeUnlinked(ptr, false);
+}
+
+template<typename T>
 void memPop(const T *ptr)
 {
     std::lock_guard<std::mutex> lock(memory_map_mutex);
@@ -226,13 +233,14 @@ void pinnedFree(T* ptr)
     memFree<T>(ptr);
 }
 
-#define INSTANTIATE(T)                                  \
-    template T* memAlloc(const size_t &elements);       \
-    template void memFree(T* ptr);                      \
-    template void memPop(const T* ptr);                 \
-    template void memPush(const T* ptr);                \
-    template T* pinnedAlloc(const size_t &elements);    \
-    template void pinnedFree(T* ptr);                   \
+#define INSTANTIATE(T)                                          \
+    template T* memAlloc(const size_t &elements);               \
+    template void memFree(T* ptr);                              \
+    template void memFreeUnlinked(T* ptr, bool free_unlinked);  \
+    template void memPop(const T* ptr);                         \
+    template void memPush(const T* ptr);                        \
+    template T* pinnedAlloc(const size_t &elements);            \
+    template void pinnedFree(T* ptr);                           \
 
 INSTANTIATE(float)
 INSTANTIATE(cfloat)
diff --git a/src/backend/cpu/memory.hpp b/src/backend/cpu/memory.hpp
index 0b1c960..1fb8c64 100644
--- a/src/backend/cpu/memory.hpp
+++ b/src/backend/cpu/memory.hpp
@@ -13,6 +13,7 @@ namespace cpu
 {
     template<typename T> T* memAlloc(const size_t &elements);
     template<typename T> void memFree(T* ptr);
+    template<typename T> void memFreeUnlinked(T* ptr, bool free_unlinked);
     template<typename T> void memPop(const T *ptr);
     template<typename T> void memPush(const T *ptr);
 
diff --git a/src/backend/cuda/memory.cpp b/src/backend/cuda/memory.cpp
index 2632a0a..e7ed8ac 100644
--- a/src/backend/cuda/memory.cpp
+++ b/src/backend/cuda/memory.cpp
@@ -65,6 +65,12 @@ namespace cuda
     }
 
     template<typename T>
+    void memFreeUnlinked(T *ptr, bool free_unlinked)
+    {
+        cudaFreeWrapper(ptr); // Free it because we are not sure what the size is
+    }
+
+    template<typename T>
     void memPop(const T *ptr)
     {
         return;
@@ -232,7 +238,7 @@ namespace cuda
     }
 
     template<typename T>
-    void memFree(T *ptr)
+    void memFreeUnlinked(T *ptr, bool free_unlinked)
     {
         int n = getActiveDeviceId();
         mem_iter iter = memory_maps[n].find((void *)ptr);
@@ -240,7 +246,9 @@ namespace cuda
         if (iter != memory_maps[n].end()) {
 
             iter->second.is_free = true;
-            if ((iter->second).is_unlinked) return;
+            if ((iter->second).is_unlinked && !free_unlinked) return;
+
+            iter->second.is_unlinked = false;
 
             used_bytes[n] -= iter->second.bytes;
             used_buffers[n]--;
@@ -251,6 +259,12 @@ namespace cuda
     }
 
     template<typename T>
+    void memFree(T *ptr)
+    {
+        memFreeUnlinked(ptr, false);
+    }
+
+    template<typename T>
     void memPop(const T *ptr)
     {
         int n = getActiveDeviceId();
@@ -368,13 +382,14 @@ namespace cuda
 
 #endif
 
-#define INSTANTIATE(T)                                  \
-    template T* memAlloc(const size_t &elements);       \
-    template void memFree(T* ptr);                      \
-    template void memPop(const T* ptr);                 \
-    template void memPush(const T* ptr);                \
-    template T* pinnedAlloc(const size_t &elements);    \
-    template void pinnedFree(T* ptr);                   \
+#define INSTANTIATE(T)                                          \
+    template T* memAlloc(const size_t &elements);               \
+    template void memFree(T* ptr);                              \
+    template void memFreeUnlinked(T* ptr, bool free_unlinked);  \
+    template void memPop(const T* ptr);                         \
+    template void memPush(const T* ptr);                        \
+    template T* pinnedAlloc(const size_t &elements);            \
+    template void pinnedFree(T* ptr);                           \
 
     INSTANTIATE(float)
     INSTANTIATE(cfloat)
diff --git a/src/backend/cuda/memory.hpp b/src/backend/cuda/memory.hpp
index 2e5fef2..a4450f3 100644
--- a/src/backend/cuda/memory.hpp
+++ b/src/backend/cuda/memory.hpp
@@ -13,6 +13,7 @@ namespace cuda
 {
     template<typename T> T* memAlloc(const size_t &elements);
     template<typename T> void memFree(T* ptr);
+    template<typename T> void memFreeUnlinked(T* ptr, bool free_unlinked);
     template<typename T> void memPop(const T *ptr);
     template<typename T> void memPush(const T *ptr);
 
diff --git a/src/backend/opencl/memory.cpp b/src/backend/opencl/memory.cpp
index f4c7404..7475710 100644
--- a/src/backend/opencl/memory.cpp
+++ b/src/backend/opencl/memory.cpp
@@ -150,13 +150,20 @@ namespace opencl
 
     void bufferFree(cl::Buffer *ptr)
     {
+        bufferFreeUnlinked(ptr, false);
+    }
+
+    void bufferFreeUnlinked(cl::Buffer *ptr, bool free_unlinked)
+    {
         int n = getActiveDeviceId();
         mem_iter iter = memory_maps[n].find(ptr);
 
         if (iter != memory_maps[n].end()) {
 
             iter->second.is_free = true;
-            if ((iter->second).is_unlinked) return;
+            if ((iter->second).is_unlinked && !free_unlinked) return;
+
+            iter->second.is_unlinked = false;
 
             used_bytes[n] -= iter->second.bytes;
             used_buffers[n]--;
@@ -212,7 +219,13 @@ namespace opencl
     template<typename T>
     void memFree(T *ptr)
     {
-        return bufferFree((cl::Buffer *)ptr);
+        return bufferFreeUnlinked((cl::Buffer *)ptr, false);
+    }
+
+    template<typename T>
+    void memFreeUnlinked(T *ptr, bool free_unlinked)
+    {
+        return bufferFreeUnlinked((cl::Buffer *)ptr, free_unlinked);
     }
 
     template<typename T>
@@ -341,13 +354,14 @@ namespace opencl
         return pinnedBufferFree((void *) ptr);
     }
 
-#define INSTANTIATE(T)                                  \
-    template T* memAlloc(const size_t &elements);       \
-    template void memFree(T* ptr);                      \
-    template void memPop(const T* ptr);                 \
-    template void memPush(const T* ptr);                \
-    template T* pinnedAlloc(const size_t &elements);    \
-    template void pinnedFree(T* ptr);                   \
+#define INSTANTIATE(T)                                          \
+    template T* memAlloc(const size_t &elements);               \
+    template void memFree(T* ptr);                              \
+    template void memFreeUnlinked(T* ptr, bool free_unlinked);  \
+    template void memPop(const T* ptr);                         \
+    template void memPush(const T* ptr);                        \
+    template T* pinnedAlloc(const size_t &elements);            \
+    template void pinnedFree(T* ptr);                           \
 
     INSTANTIATE(float)
     INSTANTIATE(cfloat)
diff --git a/src/backend/opencl/memory.hpp b/src/backend/opencl/memory.hpp
index c315a9a..40e30eb 100644
--- a/src/backend/opencl/memory.hpp
+++ b/src/backend/opencl/memory.hpp
@@ -16,9 +16,11 @@ namespace opencl
 
     cl::Buffer *bufferAlloc(const size_t &bytes);
     void bufferFree(cl::Buffer *buf);
+    void bufferFreeUnlinked(cl::Buffer *buf, bool free_unlinked);
 
     template<typename T> T *memAlloc(const size_t &elements);
-    template<typename T> void memFree(T *ptr);
+    template<typename T> void memFree(T* ptr);
+    template<typename T> void memFreeUnlinked(T* ptr, bool free_unlinked);
     template<typename T> void memPop(const T *ptr);
     template<typename T> void memPush(const T *ptr);
 

-- 
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