[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