[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