[arrayfire] 92/248: function to set active opencl device using cl_device_d

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Tue Nov 17 15:54:08 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 9d85fb5ee8727685d92283cae3ec27e4745f838a
Author: pradeep <pradeep at arrayfire.com>
Date:   Tue Sep 29 19:58:46 2015 -0400

    function to set active opencl device using cl_device_d
---
 include/af/opencl.h             | 461 +++++++++++++++++++++-------------------
 src/backend/opencl/platform.cpp |  18 ++
 src/backend/opencl/platform.hpp |   2 +
 3 files changed, 265 insertions(+), 216 deletions(-)

diff --git a/include/af/opencl.h b/include/af/opencl.h
index c9f245e..271879f 100644
--- a/include/af/opencl.h
+++ b/include/af/opencl.h
@@ -19,43 +19,54 @@
 extern "C" {
 #endif
 
-    /**
-        \ingroup opencl_mat
-        @{
-    */
-    /**
-      Get a handle to ArrayFire's OpenCL context
-
-      \param[out] ctx the current context being used by ArrayFire
-      \param[in] retain if true calls clRetainContext prior to returning the context
-      \returns \ref af_err error code
-
-      \note Set \p retain to true if this value will be passed to a cl::Context constructor
-    */
-    AFAPI af_err afcl_get_context(cl_context *ctx, const bool retain);
-
-    /**
-      Get a handle to ArrayFire's OpenCL command queue
-
-      \param[out] queue the current command queue being used by ArrayFire
-      \param[in] retain if true calls clRetainCommandQueue prior to returning the context
-      \returns \ref af_err error code
-
-      \note Set \p retain to true if this value will be passed to a cl::CommandQueue constructor
-    */
-    AFAPI af_err afcl_get_queue(cl_command_queue *queue, const bool retain);
-
-    /**
-       Get the device ID for ArrayFire's current active device
-
-       \param[out] id the cl_device_id of the current device
-       \returns \ref af_err error code
-    */
-    AFAPI af_err afcl_get_device_id(cl_device_id *id);
-
-    /**
-      @}
-    */
+/**
+    \ingroup opencl_mat
+    @{
+*/
+/**
+  Get a handle to ArrayFire's OpenCL context
+
+  \param[out] ctx the current context being used by ArrayFire
+  \param[in] retain if true calls clRetainContext prior to returning the context
+  \returns \ref af_err error code
+
+  \note Set \p retain to true if this value will be passed to a cl::Context constructor
+*/
+AFAPI af_err afcl_get_context(cl_context *ctx, const bool retain);
+
+/**
+  Get a handle to ArrayFire's OpenCL command queue
+
+  \param[out] queue the current command queue being used by ArrayFire
+  \param[in] retain if true calls clRetainCommandQueue prior to returning the context
+  \returns \ref af_err error code
+
+  \note Set \p retain to true if this value will be passed to a cl::CommandQueue constructor
+*/
+AFAPI af_err afcl_get_queue(cl_command_queue *queue, const bool retain);
+
+/**
+   Get the device ID for ArrayFire's current active device
+
+   \param[out] id the cl_device_id of the current device
+   \returns \ref af_err error code
+*/
+AFAPI af_err afcl_get_device_id(cl_device_id *id);
+
+#if AF_API_VERSION >= 32
+/**
+   Set ArrayFire's active device based on \p id of type cl_device_id
+
+   \param[in] id the cl_device_id of the device to be set as active device
+   \returns \ref af_err error code
+*/
+AFAPI af_err afcl_set_device_id(cl_device_id id);
+#endif
+
+/**
+  @}
+*/
+
 #ifdef __cplusplus
 }
 #endif
@@ -70,187 +81,205 @@ extern "C" {
 
 namespace afcl
 {
-   /**
-
-    */
-    /**
-        \ingroup opencl_mat
-        @{
-    */
-    /**
-    Get a handle to ArrayFire's OpenCL context
-
-    \param[in] retain if true calls clRetainContext prior to returning the context
-    \returns the current context being used by ArrayFire
-
-    \note Set \p retain to true if this value will be passed to a cl::Context constructor
-    */
-    static inline cl_context getContext(bool retain = false)
-    {
-        cl_context ctx;
-        af_err err = afcl_get_context(&ctx, retain);
-        if (err != AF_SUCCESS) throw af::exception("Failed to get OpenCL context from arrayfire");
-        return ctx;
-    }
-
-    /**
-    Get a handle to ArrayFire's OpenCL command queue
-
-    \param[in] retain if true calls clRetainCommandQueue prior to returning the context
-    \returns the current command queue being used by ArrayFire
-
-    \note Set \p retain to true if this value will be passed to a cl::CommandQueue constructor
-    */
-    static inline cl_command_queue getQueue(bool retain = false)
-    {
-        cl_command_queue queue;
-        af_err err = afcl_get_queue(&queue, retain);
-        if (err != AF_SUCCESS) throw af::exception("Failed to get OpenCL command queue from arrayfire");
-        return queue;
-    }
-
-    /**
-       Get the device ID for ArrayFire's current active device
-       \returns the cl_device_id of the current device
-    */
-    static inline cl_device_id getDeviceId()
-    {
-        cl_device_id id;
-        af_err err = afcl_get_device_id(&id);
-        if (err != AF_SUCCESS) throw af::exception("Failed to get OpenCL device ID");
-
-        return id;
-    }
-
-    /**
-    Create an af::array object from an OpenCL cl_mem buffer
-
-    \param[in] idims the dimensions of the buffer
-    \param[in] buf the OpenCL memory object
-    \param[in] type the data type contained in the buffer
-    \param[in] retain if true, instructs ArrayFire to retain the memory object
-    \returns an array object created from the OpenCL buffer
-
-    \note Set \p retain to true if the memory originates from a cl::Buffer object
-     */
-    static inline af::array array(af::dim4 idims, cl_mem buf, af::dtype type, bool retain=false)
-    {
-        const unsigned ndims = (unsigned)idims.ndims();
-        const dim_t *dims = idims.get();
-
-        cl_context context;
-        cl_int clerr = clGetMemObjectInfo(buf, CL_MEM_CONTEXT, sizeof(cl_context), &context, NULL);
-        if (clerr != CL_SUCCESS) {
-            throw af::exception("Failed to get context from cl_mem object \"buf\" ");
-        }
-
-        if (context != getContext()) {
-            throw(af::exception("Context mismatch between input \"buf\" and arrayfire"));
-        }
-
-
-        if (retain) clerr = clRetainMemObject(buf);
-
-        af_array out;
-        af_err err = af_device_array(&out, buf, ndims, dims, type);
-
-        if (err != AF_SUCCESS || clerr != CL_SUCCESS) {
-            if (retain && clerr == CL_SUCCESS) clReleaseMemObject(buf);
-            throw af::exception("Failed to create device array");
-        }
-
-        return af::array(out);
-    }
-
-    /**
-    Create an af::array object from an OpenCL cl_mem buffer
-
-    \param[in] dim0 the length of the first dimension of the buffer
-    \param[in] buf the OpenCL memory object
-    \param[in] type the data type contained in the buffer
-    \param[in] retain if true, instructs ArrayFire to retain the memory object
-    \returns an array object created from the OpenCL buffer
-
-    \note Set \p retain to true if the memory originates from a cl::Buffer object
-     */
-    static inline af::array array(dim_t dim0,
-                                  cl_mem buf, af::dtype type, bool retain=false)
-    {
-        return afcl::array(af::dim4(dim0), buf, type, retain);
-    }
-
-    /**
-    Create an af::array object from an OpenCL cl_mem buffer
-
-    \param[in] dim0 the length of the first dimension of the buffer
-    \param[in] dim1 the length of the second dimension of the buffer
-    \param[in] buf the OpenCL memory object
-    \param[in] type the data type contained in the buffer
-    \param[in] retain if true, instructs ArrayFire to retain the memory object
-    \returns an array object created from the OpenCL buffer
-
-    \note Set \p retain to true if the memory originates from a cl::Buffer object
-     */
-    static inline af::array array(dim_t dim0, dim_t dim1,
-                                  cl_mem buf, af::dtype type, bool retain=false)
-    {
-        return afcl::array(af::dim4(dim0, dim1), buf, type, retain);
-    }
-
-    /**
-    Create an af::array object from an OpenCL cl_mem buffer
-
-    \param[in] dim0 the length of the first dimension of the buffer
-    \param[in] dim1 the length of the second dimension of the buffer
-    \param[in] dim2 the length of the third dimension of the buffer
-    \param[in] buf the OpenCL memory object
-    \param[in] type the data type contained in the buffer
-    \param[in] retain if true, instructs ArrayFire to retain the memory object
-    \returns an array object created from the OpenCL buffer
-
-    \note Set \p retain to true if the memory originates from a cl::Buffer object
-     */
-    static inline af::array array(dim_t dim0, dim_t dim1,
-                                  dim_t dim2,
-                                  cl_mem buf, af::dtype type, bool retain=false)
-    {
-        return afcl::array(af::dim4(dim0, dim1, dim2), buf, type, retain);
-    }
-
-    /**
-    Create an af::array object from an OpenCL cl_mem buffer
-
-    \param[in] dim0 the length of the first dimension of the buffer
-    \param[in] dim1 the length of the second dimension of the buffer
-    \param[in] dim2 the length of the third dimension of the buffer
-    \param[in] dim3 the length of the fourth dimension of the buffer
-    \param[in] buf the OpenCL memory object
-    \param[in] type the data type contained in the buffer
-    \param[in] retain if true, instructs ArrayFire to retain the memory object
-    \returns an array object created from the OpenCL buffer
-
-    \note Set \p retain to true if the memory originates from a cl::Buffer object
-     */
-    static inline af::array array(dim_t dim0, dim_t dim1,
-                                  dim_t dim2, dim_t dim3,
-                                  cl_mem buf, af::dtype type, bool retain=false)
-    {
-        return afcl::array(af::dim4(dim0, dim1, dim2, dim3), buf, type, retain);
-    }
-
-    /**
-      @}
-    */
+
+/**
+
+ */
+ /**
+     \ingroup opencl_mat
+     @{
+ */
+ /**
+ Get a handle to ArrayFire's OpenCL context
+
+ \param[in] retain if true calls clRetainContext prior to returning the context
+ \returns the current context being used by ArrayFire
+
+ \note Set \p retain to true if this value will be passed to a cl::Context constructor
+ */
+ static inline cl_context getContext(bool retain = false)
+ {
+     cl_context ctx;
+     af_err err = afcl_get_context(&ctx, retain);
+     if (err != AF_SUCCESS) throw af::exception("Failed to get OpenCL context from arrayfire");
+     return ctx;
+ }
+
+ /**
+ Get a handle to ArrayFire's OpenCL command queue
+
+ \param[in] retain if true calls clRetainCommandQueue prior to returning the context
+ \returns the current command queue being used by ArrayFire
+
+ \note Set \p retain to true if this value will be passed to a cl::CommandQueue constructor
+ */
+ static inline cl_command_queue getQueue(bool retain = false)
+ {
+     cl_command_queue queue;
+     af_err err = afcl_get_queue(&queue, retain);
+     if (err != AF_SUCCESS) throw af::exception("Failed to get OpenCL command queue from arrayfire");
+     return queue;
+ }
+
+ /**
+    Get the device ID for ArrayFire's current active device
+    \returns the cl_device_id of the current device
+ */
+ static inline cl_device_id getDeviceId()
+ {
+     cl_device_id id;
+     af_err err = afcl_get_device_id(&id);
+     if (err != AF_SUCCESS) throw af::exception("Failed to get OpenCL device ID");
+
+     return id;
+ }
+
+#if AF_API_VERSION >= 32
+ /**
+   Set ArrayFire's active device based on \p id of type cl_device_id
+
+   \param[in] id the cl_device_id of the device to be set as active device
+ */
+ static inline void setDeviceId(cl_device_id id)
+ {
+     af_err err = afcl_set_device_id(id);
+     if (err != AF_SUCCESS) throw af::exception("Failed to set OpenCL device as active device");
+ }
+#endif
+
+ /**
+ Create an af::array object from an OpenCL cl_mem buffer
+
+ \param[in] idims the dimensions of the buffer
+ \param[in] buf the OpenCL memory object
+ \param[in] type the data type contained in the buffer
+ \param[in] retain if true, instructs ArrayFire to retain the memory object
+ \returns an array object created from the OpenCL buffer
+
+ \note Set \p retain to true if the memory originates from a cl::Buffer object
+  */
+ static inline af::array array(af::dim4 idims, cl_mem buf, af::dtype type, bool retain=false)
+ {
+     const unsigned ndims = (unsigned)idims.ndims();
+     const dim_t *dims = idims.get();
+
+     cl_context context;
+     cl_int clerr = clGetMemObjectInfo(buf, CL_MEM_CONTEXT, sizeof(cl_context), &context, NULL);
+     if (clerr != CL_SUCCESS) {
+         throw af::exception("Failed to get context from cl_mem object \"buf\" ");
+     }
+
+     if (context != getContext()) {
+         throw(af::exception("Context mismatch between input \"buf\" and arrayfire"));
+     }
+
+
+     if (retain) clerr = clRetainMemObject(buf);
+
+     af_array out;
+     af_err err = af_device_array(&out, buf, ndims, dims, type);
+
+     if (err != AF_SUCCESS || clerr != CL_SUCCESS) {
+         if (retain && clerr == CL_SUCCESS) clReleaseMemObject(buf);
+         throw af::exception("Failed to create device array");
+     }
+
+     return af::array(out);
+ }
+
+ /**
+ Create an af::array object from an OpenCL cl_mem buffer
+
+ \param[in] dim0 the length of the first dimension of the buffer
+ \param[in] buf the OpenCL memory object
+ \param[in] type the data type contained in the buffer
+ \param[in] retain if true, instructs ArrayFire to retain the memory object
+ \returns an array object created from the OpenCL buffer
+
+ \note Set \p retain to true if the memory originates from a cl::Buffer object
+  */
+ static inline af::array array(dim_t dim0,
+                               cl_mem buf, af::dtype type, bool retain=false)
+ {
+     return afcl::array(af::dim4(dim0), buf, type, retain);
+ }
+
+ /**
+ Create an af::array object from an OpenCL cl_mem buffer
+
+ \param[in] dim0 the length of the first dimension of the buffer
+ \param[in] dim1 the length of the second dimension of the buffer
+ \param[in] buf the OpenCL memory object
+ \param[in] type the data type contained in the buffer
+ \param[in] retain if true, instructs ArrayFire to retain the memory object
+ \returns an array object created from the OpenCL buffer
+
+ \note Set \p retain to true if the memory originates from a cl::Buffer object
+  */
+ static inline af::array array(dim_t dim0, dim_t dim1,
+                               cl_mem buf, af::dtype type, bool retain=false)
+ {
+     return afcl::array(af::dim4(dim0, dim1), buf, type, retain);
+ }
+
+ /**
+ Create an af::array object from an OpenCL cl_mem buffer
+
+ \param[in] dim0 the length of the first dimension of the buffer
+ \param[in] dim1 the length of the second dimension of the buffer
+ \param[in] dim2 the length of the third dimension of the buffer
+ \param[in] buf the OpenCL memory object
+ \param[in] type the data type contained in the buffer
+ \param[in] retain if true, instructs ArrayFire to retain the memory object
+ \returns an array object created from the OpenCL buffer
+
+ \note Set \p retain to true if the memory originates from a cl::Buffer object
+  */
+ static inline af::array array(dim_t dim0, dim_t dim1,
+                               dim_t dim2,
+                               cl_mem buf, af::dtype type, bool retain=false)
+ {
+     return afcl::array(af::dim4(dim0, dim1, dim2), buf, type, retain);
+ }
+
+ /**
+ Create an af::array object from an OpenCL cl_mem buffer
+
+ \param[in] dim0 the length of the first dimension of the buffer
+ \param[in] dim1 the length of the second dimension of the buffer
+ \param[in] dim2 the length of the third dimension of the buffer
+ \param[in] dim3 the length of the fourth dimension of the buffer
+ \param[in] buf the OpenCL memory object
+ \param[in] type the data type contained in the buffer
+ \param[in] retain if true, instructs ArrayFire to retain the memory object
+ \returns an array object created from the OpenCL buffer
+
+ \note Set \p retain to true if the memory originates from a cl::Buffer object
+  */
+ static inline af::array array(dim_t dim0, dim_t dim1,
+                               dim_t dim2, dim_t dim3,
+                               cl_mem buf, af::dtype type, bool retain=false)
+ {
+     return afcl::array(af::dim4(dim0, dim1, dim2, dim3), buf, type, retain);
+ }
+
+ /**
+   @}
+ */
+
+}
+
+namespace af
+{
+
+template<> AFAPI cl_mem *array::device() const
+{
+    cl_mem *mem = new cl_mem;
+    af_err err = af_get_device_ptr((void **)mem, get());
+    if (err != AF_SUCCESS) throw af::exception("Failed to get cl_mem from array object");
+    return mem;
 }
 
-namespace af {
-    template<> AFAPI cl_mem *array::device() const
-    {
-        cl_mem *mem = new cl_mem;
-        af_err err = af_get_device_ptr((void **)mem, get());
-        if (err != AF_SUCCESS) throw af::exception("Failed to get cl_mem from array object");
-        return mem;
-    }
 }
 
 #endif
diff --git a/src/backend/opencl/platform.cpp b/src/backend/opencl/platform.cpp
index dd96d2e..753a844 100644
--- a/src/backend/opencl/platform.cpp
+++ b/src/backend/opencl/platform.cpp
@@ -281,6 +281,18 @@ int getActiveDeviceId()
     return DeviceManager::getInstance().mActiveQId;
 }
 
+int getDeviceIdFromNativeId(cl_device_id id)
+{
+    DeviceManager& devMngr = DeviceManager::getInstance();
+    int nDevices = devMngr.mDevices.size();
+    int devId = 0;
+    for (devId=0; devId<nDevices; ++devId) {
+        if (id == devMngr.mDevices[devId]->operator()())
+            break;
+    }
+    return devId;
+}
+
 const Context& getContext()
 {
     DeviceManager& devMngr = DeviceManager::getInstance();
@@ -488,3 +500,9 @@ af_err afcl_get_device_id(cl_device_id *id)
     *id = getDevice()();
     return AF_SUCCESS;
 }
+
+af_err afcl_set_device_id(cl_device_id id)
+{
+    setDevice(getDeviceIdFromNativeId(id));
+    return AF_SUCCESS;
+}
diff --git a/src/backend/opencl/platform.hpp b/src/backend/opencl/platform.hpp
index 8d3a1d0..d59852e 100644
--- a/src/backend/opencl/platform.hpp
+++ b/src/backend/opencl/platform.hpp
@@ -27,6 +27,8 @@ class DeviceManager
 
     friend int getActiveDeviceId();
 
+    friend int getDeviceIdFromNativeId(cl_device_id id);
+
     friend const cl::Context& getContext();
 
     friend cl::CommandQueue& getQueue();

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