+ All Categories
Home > Documents > OpenCL Interoperability with OpenVX - IWOCL · By Ben Ashbaugh and Ariel Bernal, Intel®...

OpenCL Interoperability with OpenVX - IWOCL · By Ben Ashbaugh and Ariel Bernal, Intel®...

Date post: 30-Apr-2021
Category:
Upload: others
View: 3 times
Download: 0 times
Share this document with a friend
1
IWOCL 2017 Toronto, ON Canada | 16-18 May OpenCL Interoperability with OpenVX First: OpenCL-C kernels 2 OpenCL programs are passed to the framework Framework compiles kernels Users specify inputs and outputs and work item sizes. Map is needed between OpenVX objects and OpenCL kernel arguments. No OpenCL runtime required. Some OpenCL kernels are not supported. Second: OpenCL Interop kernels 3 A general solution, no OpenCL kernel restrictions. Many OpenCL kernels in one OpenVX kernel. User determine how to enqueue them. By Ben Ashbaugh and Ariel Bernal, Intel® Corporation OpenVX Open computer vision framework Graph-based API => system-level optimization. Includes many kernels but not all. Supports C based user kernels. The problem No accelerated user kernels. Two solutions proposed 1 . Introduction Interop Kernel Example Users can request the OpenCL context, create multiple OpenCL kernels and add them to an OpenVX user-kernel. OpenCL buffers can be obtained from OpenVX objects. vx_image can be interpreted as a buffer or image2d. // Get OpenCL context associated with an OpenVX target cl_context clContext = vxGetOpenCLContext(vxContext, targt); // OpenCL standard code for creating kernels cl_program clProgram = clCreateProgramWithSource(&src, ...); cl_kernel clKernel0 = clCreateKernel(clProgram, "k0", ...); cl_kernel clKernel1 = clCreateKernel(clProgram, "k1", ...); ... // Create OpenCL interop kernel vx_kernel vxKernel = vxAddOpenCLInteropKernel(targets, ..., userFunc, userVal, userInit, userDeinit); vxAddOpenCLKernelToKernel(vxKernel, 0, clKernel0); vxAddOpenCLKernelToKernel(vxKernel, 1, clKernel1); vxAddParameterToKernel(vxKernel, 0, VX_INPUT, ...); vxAddParameterToKernel(vxKernel, 1, VX_OUTPUT, ...); vxFinalizeKernel(vxKernel); // Create a generic node vx_node node = vxCreateGenericNode(graph, kernel); vxSetParameterByIndex(node, 0, inputImage); vxSetParameterByIndex(node, 1, outputImage); vxProcessGraph(graph); vx_status userFunc(vx_node node, vx_reference* parameters, cl_kernel* kernels, cl_command_queue queue) { vx_image vxImg = (vx_image) parameters[0]; vx_array vxArr = (vx_array) parameters[1]; cl_mem clBuf = vxGetOpenCLBufferFromImage(node, vxImg); cl_mem clImage = vxGetOpenCLImage2DFromImage(node, vxImg); cl_mem clArray = vxGetOpenCLBufferFromArray(node, vxArr); // This can be moved to the initializer clSetKernelArgs(kernels[0], 0, sizeof(cl_mem), &clImage); ... clEnqueueNDRangeKernel(queue, clKernel[0], ...); } Interop Kernels – OpenCL Context OpenVX inserts OpenCL user kernels in the graph. The framework may use the same command queue for built-in kernels using OpenCL and Interop kernels. An OpenCL (context, device) pair is associated with an OpenVX target. Output Input OpenCL Subgraph OpenCL User-Kernel CPU Path OpenCL Command Queue CL Platform Device A Device B Device C Context A Context B VX Context Target A Target B Target C . . . 1 Design is not limited to Intel architectures. 2 Intel currently supports this device kernel extension. 3 Currently in POC stage, OpenVX1.1 sample. Intel and the Intel logo are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries. *Other names and brands may be claimed as the property of others. OpenCL and the OpenCL logo are trademarks of Apple Inc. used by permission by Khronos. OpenVX and the OpenVX logo are trademarks of the Khronos Group Inc..
Transcript
Page 1: OpenCL Interoperability with OpenVX - IWOCL · By Ben Ashbaugh and Ariel Bernal, Intel® Corporation OpenVX •Open computer vision framework •Graph-based API => system-level optimization.

IWOCL 2017

Toronto, ON Canada | 16-18 May

OpenCL Interoperability with OpenVX

First: OpenCL-C kernels2

• OpenCL programs are passed to the framework • Framework compiles kernels • Users specify inputs and outputs and work item sizes. • Map is needed between OpenVX objects and OpenCL

kernel arguments. • No OpenCL runtime required. • Some OpenCL kernels are not supported.

Second: OpenCL Interop kernels3

• A general solution, no OpenCL kernel restrictions.

• Many OpenCL kernels in one OpenVX kernel. • User determine how to enqueue them.

By Ben Ashbaugh and Ariel Bernal, Intel® Corporation

OpenVX • Open computer vision framework • Graph-based API => system-level

optimization. • Includes many kernels but not all. • Supports C based user kernels.

The problem • No accelerated user kernels. • Two solutions proposed1.

Introduction

Interop Kernel Example • Users can request the OpenCL context, create multiple

OpenCL kernels and add them to an OpenVX user-kernel.

• OpenCL buffers can be obtained from OpenVX objects. • vx_image can be interpreted as a buffer or image2d.

// Get OpenCL context associated with an OpenVX target cl_context clContext = vxGetOpenCLContext(vxContext, targt); // OpenCL standard code for creating kernels cl_program clProgram = clCreateProgramWithSource(&src, ...); cl_kernel clKernel0 = clCreateKernel(clProgram, "k0", ...); cl_kernel clKernel1 = clCreateKernel(clProgram, "k1", ...); ... // Create OpenCL interop kernel vx_kernel vxKernel = vxAddOpenCLInteropKernel(targets, ..., userFunc, userVal, userInit, userDeinit); vxAddOpenCLKernelToKernel(vxKernel, 0, clKernel0); vxAddOpenCLKernelToKernel(vxKernel, 1, clKernel1); vxAddParameterToKernel(vxKernel, 0, VX_INPUT, ...); vxAddParameterToKernel(vxKernel, 1, VX_OUTPUT, ...); vxFinalizeKernel(vxKernel); // Create a generic node vx_node node = vxCreateGenericNode(graph, kernel); vxSetParameterByIndex(node, 0, inputImage); vxSetParameterByIndex(node, 1, outputImage); vxProcessGraph(graph);

vx_status userFunc(vx_node node, vx_reference* parameters, cl_kernel* kernels, cl_command_queue queue) { vx_image vxImg = (vx_image) parameters[0]; vx_array vxArr = (vx_array) parameters[1]; cl_mem clBuf = vxGetOpenCLBufferFromImage(node, vxImg); cl_mem clImage = vxGetOpenCLImage2DFromImage(node, vxImg); cl_mem clArray = vxGetOpenCLBufferFromArray(node, vxArr); // This can be moved to the initializer clSetKernelArgs(kernels[0], 0, sizeof(cl_mem), &clImage); ... clEnqueueNDRangeKernel(queue, clKernel[0], ...); }

Interop Kernels – OpenCL Context • OpenVX inserts OpenCL user kernels in the

graph. • The framework may use the same command

queue for built-in kernels using OpenCL and Interop kernels.

• An OpenCL (context, device) pair is associated with an OpenVX target.

Output Input

OpenCL Subgraph OpenCL User-Kernel

CPU Path

OpenCL Command Queue

CL

Platform

Device

A

Device B

Device C

Context A

Context B

VX

Context

Target A

Target B

Target C

. . .

1Design is not limited to Intel architectures. 2Intel currently supports this device kernel extension. 3Currently in POC stage, OpenVX1.1 sample. Intel and the Intel logo are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries. *Other names and brands may be claimed as the property of others. OpenCL and the OpenCL logo are trademarks of Apple Inc. used by permission by Khronos. OpenVX and the OpenVX logo are trademarks of the Khronos Group Inc..

Recommended