[arrayfire] 21/248: Cleaned up symbol manager class in HAPI wrapper
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Tue Nov 17 15:53:50 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to branch dfsg-clean
in repository arrayfire.
commit 8d73db45681b02b52c156ce8c0a59e2a86f8142a
Author: pradeep <pradeep at arrayfire.com>
Date: Sat Aug 29 15:28:10 2015 -0400
Cleaned up symbol manager class in HAPI wrapper
---
include/af/defines.h | 7 ++--
src/api/hapi/symbol_manager.cpp | 87 ++++++++++++++++++-----------------------
src/api/hapi/symbol_manager.hpp | 17 ++------
3 files changed, 46 insertions(+), 65 deletions(-)
diff --git a/include/af/defines.h b/include/af/defines.h
index bc53cff..ba2aea9 100644
--- a/include/af/defines.h
+++ b/include/af/defines.h
@@ -322,9 +322,10 @@ typedef enum {
} af_image_format;
typedef enum {
- AF_BACKEND_CPU,
- AF_BACKEND_CUDA,
- AF_BACKEND_OPENCL
+ AF_BACKEND_CPU = 0, ///< CPU a.k.a sequential algorithms
+ AF_BACKEND_CUDA = 1, ///< CUDA Compute Backend
+ AF_BACKEND_OPENCL = 2, ///< OpenCL Compute Backend
+ AF_BACKEND_DEFAULT = 3 ///< Default backend order: OpenCL -> CUDA -> CPU
} af_backend;
// Below enum is purely added for example purposes
diff --git a/src/api/hapi/symbol_manager.cpp b/src/api/hapi/symbol_manager.cpp
index ded6ef7..a2cd701 100644
--- a/src/api/hapi/symbol_manager.cpp
+++ b/src/api/hapi/symbol_manager.cpp
@@ -9,6 +9,13 @@
#include "symbol_manager.hpp"
+#if defined(OS_WIN)
+static const char* LIB_AF_BKND_NAME[] = {"afcpu.dll", "afcuda.dll", "afopencl.dll"};
+#define RTLD_LAZY 0
+#else
+static const char* LIB_AF_BKND_NAME[] = {"libafcpu.so", "libafcuda.so", "libafopencl.so"};
+#endif
+
AFSymbolManager& AFSymbolManager::getInstance()
{
static AFSymbolManager symbolManager;
@@ -39,64 +46,48 @@ void closeDynLibrary(LibHandle handle)
}
AFSymbolManager::AFSymbolManager()
- : isCPULoaded(false), isCUDALoaded(false), isOCLLoaded(false)
+ : backendBitFlag(0x0000), activeHandle(NULL), defaultHandle(NULL)
{
- cpuHandle = openDynLibrary(LIB_AF_CPU_NAME);
- if (cpuHandle) {
- isCPULoaded = true;
- activeHandle = cpuHandle;
- }
- cudaHandle = openDynLibrary(LIB_AF_CUDA_NAME);
- if (cudaHandle) {
- isCUDALoaded = true;
- activeHandle = cudaHandle;
- }
- oclHandle = openDynLibrary(LIB_AF_OCL_NAME);
- if (oclHandle) {
- isOCLLoaded = true;
- activeHandle = oclHandle;
+ // AF_BACKEND_DEFAULT enum value is 1 + last valid compute
+ // backend in af_backend enum, hence it represents the number
+ // of valid backends in ArrayFire framework
+ unsigned bkndFlag = 0x0001;
+ for(int i=0; i<AF_BACKEND_DEFAULT; ++i) {
+ bkndHandles[i] = openDynLibrary(LIB_AF_BKND_NAME[i]);
+ if (bkndHandles[i]) {
+ backendBitFlag |= bkndFlag;
+ activeHandle = bkndHandles[i];
+ }
+ bkndFlag = bkndFlag << 1;
}
+ // Keep a copy of default order handle
+ // inorder to use it in ::setBackend when
+ // the user passes AF_BACKEND_DEFAULT
+ defaultHandle = activeHandle;
}
AFSymbolManager::~AFSymbolManager()
{
- if (isCPULoaded) {
- closeDynLibrary(cpuHandle);
- isCPULoaded = false;
- }
- if (isCUDALoaded) {
- closeDynLibrary(cudaHandle);
- isCUDALoaded = false;
- }
- if (isOCLLoaded) {
- closeDynLibrary(oclHandle);
- isOCLLoaded = false;
+ unsigned bkndFlag = 0x0001;
+ for(int i=0; i<AF_BACKEND_DEFAULT; ++i) {
+ if (bkndFlag & backendBitFlag)
+ closeDynLibrary(bkndHandles[i]);
+ bkndFlag = bkndFlag << 1;
}
+ backendBitFlag = 0x0000;
}
af_err AFSymbolManager::setBackend(af::Backend bknd)
{
- af_err retCode = AF_SUCCESS;
- activeBknd = bknd;
- switch (activeBknd) {
- case af::Backend::AF_BACKEND_CPU:
- if(isCPULoaded)
- activeHandle = cpuHandle;
- else
- retCode = AF_ERR_LOAD_LIB;
- break;
- case af::Backend::AF_BACKEND_CUDA:
- if(isCUDALoaded)
- activeHandle = cudaHandle;
- else
- retCode = AF_ERR_LOAD_LIB;
- break;
- case af::Backend::AF_BACKEND_OPENCL:
- if (isOCLLoaded)
- activeHandle = oclHandle;
- else
- retCode = AF_ERR_LOAD_LIB;
- break;
+ if (bknd==AF_BACKEND_DEFAULT) {
+ activeHandle = defaultHandle;
+ return AF_SUCCESS;
+ }
+ unsigned bkndFlag = 0x0001;
+ if((bkndFlag << bknd) & backendBitFlag) {
+ activeHandle = bkndHandles[bknd];
+ return AF_SUCCESS;
+ } else {
+ return AF_ERR_LOAD_LIB;
}
- return retCode;
}
diff --git a/src/api/hapi/symbol_manager.hpp b/src/api/hapi/symbol_manager.hpp
index 8af2f3f..848bf31 100644
--- a/src/api/hapi/symbol_manager.hpp
+++ b/src/api/hapi/symbol_manager.hpp
@@ -13,16 +13,9 @@
#if defined(OS_WIN)
#include <Windows.h>
typedef HMODULE LibHandle;
-#define RTLD_LAZY 0
-#define LIB_AF_CPU_NAME "afcpu.dll"
-#define LIB_AF_CUDA_NAME "afcuda.dll"
-#define LIB_AF_OCL_NAME "afopencl.dll"
#else
#include <dlfcn.h>
typedef void* LibHandle;
-#define LIB_AF_CPU_NAME "libafcpu.so"
-#define LIB_AF_CUDA_NAME "libafcuda.so"
-#define LIB_AF_OCL_NAME "libafopencl.so"
#endif
class AFSymbolManager {
@@ -59,16 +52,12 @@ class AFSymbolManager {
void operator=(AFSymbolManager const&);
private:
- bool isCPULoaded;
- bool isCUDALoaded;
- bool isOCLLoaded;
+ unsigned backendBitFlag;
- LibHandle cpuHandle;
- LibHandle cudaHandle;
- LibHandle oclHandle;
+ LibHandle bkndHandles[3];
- af::Backend activeBknd;
LibHandle activeHandle;
+ LibHandle defaultHandle;
};
#if defined(OS_WIN)
--
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