11 Sep 2017

Running OpenCL Sample Application on Open-Q™ 820 System on Module, powered by Qualcomm® Snapdragon™ 820 SOC

Running OpenCL Sample Application on Open-Q™ 820

OpenCL (Open Computing Language) is an industry standard that allows​​ software developers​​ to take advantage of​​ multiple processors in order to increase the performance of​​ computational tasks.​​ While originally​​ designed for desktop computers,​​ OpenCL​​ has​​ in recent years slowly​​ been​​ becoming​​ more​​ available on​​ embedded systems​​ as more​​ Graphics Processing Units​​ (GPUs)​​ become OpenCL compatible.​​ With the help of OpenCL,​​ GPUs​​ are able to​​ perform​​ intensive​​ parallel programming tasks​​ in graphics-related as well as​​ non-graphics related computational workloads, allowing for significantly improved processing times.​​ ​​ One of the​​ GPUs​​ used in smartphones and tablets that​​ now​​ supports OpenCL​​ is Qualcomm’s Adreno 530, which is used in Intrinsyc’s Open-Q 820 Development Kit.​​ 

In order to demonstrate the​​ decreased​​ processing time enabled by​​ OpenCL on the Adreno 530, a​​ sample application​​ originally​​ taken from the Sony Mobile website​​ [1]​​ will be used.​​ (This is not available on​​ the​​ Sony website any​​ more but​​ is available as archived pages [3], and in Github [4]).​​ Since the source code was originally targeted toward Sony Xperia devices​​ [2], it has been​​ slightly​​ modified for​​ use by the different hardware of​​ the Open-Q 820.​​ The sample application​​ applies​​ OpenCL to a math intensive bilateral filter operation on a​​ noisy​​ photo. In one case, the bilateral filter is applied using OpenCL, while in the second case it is applied using Native C.​​ While the execution time​​ improvements​​ may vary across different OpenCL-supported devices due to differences in​​ architecture,​​ executing​​ the​​ bilateral filter using OpenCL on the Open-Q 820​​ (GPU)​​ has demonstrated to be​​ over 300 times faster​​ than using Native C​​ (ARM/CPU).

The following sections​​ describe our modifications to​​ Sony’s sample application​​ that we performed for​​ the Open-Q 820.​​ Section​​ 1​​ illustrates​​ the expected behavior of the application​​ after modifying it for use on the Open-Q 820. Section​​ 2​​ describes the steps that were taken to modify the original sample application from Sony Mobile such that the source code could be built for Intrinsyc’s Open-Q 820. Section​​ 3​​ provides some suggestions for when troubleshooting is required.

Note: the instructions in this blog were tested for Open-Q 820 BSP Version​​ 4.1. These instructions may still work for other versions if OpenCL is supported on them. Please see Section​​ 3,​​ step 2 to check if OpenCL is supported.

Section​​ 1: Using the OpenCL Sample Application


Upon opening OpenCLexample1 on the device, a noisy image is shown along with three buttons.​​ 


The application will run a bilateral filter on the image to reduce the noise using either OpenCL or Native C, depending on which button is pressed.​​ Press Reset between running OpenCL and NativeC to ensure the bilateral filter is applied to the noisy image.​​ Pressing the OpenCL button should yield a much​​ faster​​ processing time than pressing the NativeC button​​ (for example, 5ms versus 1638ms). The processing time will be displayed at the top of the screen.

Section​​ 2: Modifying the Original OpenCL Sample Application to be built for the Open-Q 820


The following tutorial outlines the steps required to​​ modify​​ and build​​ Sony’s OpenCL code example,​​ taken from the Sony Mobile website,​​ using Android Studio​​ for Intrinsyc’s Open-Q 820 Development Kit.

Before initiating the steps below, ensure the latest NDK is set up by following steps at​​ https://developer.android.com/ndk/guides/index.html

  • Download Sony’s OpenCL code example from​​ Github:

git clone https://github.com/alon21034/android-opencl-example.git​​ 

or from archived pages of original Sony website as in [3].

  • Ensure NDK is set up:


  • Import openclexample1 into Android Studio as a new project:

    • In Android Studio,​​ select​​ File​​ ​​ New​​ ​​ Import Project​​ (Gradle, Eclipse ADT, etc)

    • Select the location of​​ android-opencl-example/OpenCL_code_example/openclexample1

C:\Users\arosa\Pictures\OpenCLBlog\1 - selectProjectToImport.png

    • Create an import destination directory.

C:\Users\arosa\Pictures\OpenCLBlog\2 - importDestinationDirectory.png

    • Click Finish with the default options selected

C:\Users\arosa\Pictures\OpenCLBlog\3 -  importProject.png

  • Manually copy over any files from listed under "Ignored Files" in the generated import-summary.txt file.

C:\Users\arosa\Pictures\OpenCLBlog\4 - import-summary.png

    • For example, it may be necessary to manually copy over the following from the OpenCL_code_example/openclexample1 folder to the destination directory created in step 3c:

      • /OpenCL_code_example/openclexample1/extra_libs to /OpenCLSample/app/src/main/extra_libs

      • /OpenCL_code_example/openclexample1/include/ to /OpenCLSample/app/src/main/include

  • Link C++ project with gradle:

    • Right-click the project in Android Studio ("app" in the project view) and select "Link C++ Project with Gradle"

C:\Users\arosa\Pictures\OpenCLBlog\5 - linkc++.png

    • Select ndk-build and the location of Android.mk for the Build System and Project Path, respectively.

C:\Users\arosa\Pictures\OpenCLBlog\6 - selectMakeFile.png

  • Replace libOpenCL.so with the one used by the device:

    • Use adb pull to get the file directly from the device.

adb pull vendor/lib64/libOpenCL.so

    • Replace​​ openclexample1/OpenCLSample/app/src/main/extra_libs/libOpenCL.so with this new libOpenCL.so file.

  • The ABI used by the Open-Q 820 dev kit is arm64-v8a, which is supported as of SDK version 27. Therefore:

    • Modify the app level build.gradle file:

      • Change values of compileSdkVersion, minSdkVersion, and targetSdkVersion to 27.​​ (This is for Android Oreo 8.1. For other Android versions use SDK level corresponding to the version)

      • Add abiFilters ‘arm64-v8a’ to ndk (which should have been generated under defaultConfig).