前言

之前谈到如何使用Windows平台搭建OpenCL的C库。今天打算做同样的事,只不过这次是在华为HarmonyOS鸿蒙手机搭建。

如何在HarmonyOS上运行OpenCL

我用的开发平台是华为的DevEco 2.1,用其它版本的应该也不会有太大的区别。

先创造一个新的Native C++项目:
在这里插入图片描述
ProjectName随便起名,值得注意的是Package Name需要记一下,过一会在华为的开发者网站上得 注册一下。Project Type 是Application应用。

Device Type 选手机Phone, Compatible API Version选SDK:Api Version 4. Version 5 也可以。
在这里插入图片描述
然后如同Windows安装时一样,得把OpenCL的移动库给下载到工程中。

下载OpenCL的库
或者 git clone https://gitee.com/Liu2333Hui/open-cl_-harmony-os

把以上的OpenCL库下到相关的目录(我选的是项目的根目录)。open-cl_-harmony-os目录里会有几个目录,分别是HarmonyOS, Windows, FPGA, 等等不一样的支持OpenCL的平台。我们这里先会用到HarmonyOS的OpenCL库.

这里最好是把HarmonyOS目录的libsinclude文件夹放在entry/src/main/cpp里如以下的图。
请添加图片描述
为了能让项目能夠找到libOpenCL.so,我们需要更改Cmakelists.txt.

请把默认的Cmakelists.txt 代码替换成:

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(OpenCL_Install)

include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${CMAKE_SOURCE_DIR}/libs)

add_library(hello SHARED hello.cpp)
target_link_libraries(hello libhilog_ndk.z.so libOpenCL.so )

请注意,project(OpenCL_Install)要与大家之前的项目名子要一致。

然后就可以验证有没有成功的把OpenCL ARM的库连给接好。

请把默认的hello.cpp 代码添加#include "CL/cl.h"

然后运行. 可能大家会遇见一下的抱错:
请添加图片描述
不用怕,这里只需要登录就好了。按照HarmonyOS Signature

如果一切顺利的话就能进行调试了。
请添加图片描述
然后在真机跑。。

请添加图片描述

成功!😄

查看HarmonyOS上运行的OpenCL版本

如果迫不及待的想在进一步研究,可以通过修改hello.cpp,我们到时后(下一章节再会更深入的了解OpenCL的具体API).

#include "CL/cl.h"

#define LOG_DOMAIN 0x00201
#define LOG_TAG "MY_TAG"

在main函数里添加

extern "C"
JNIEXPORT jstring JNICALL
Java_com_taiji_opencl_1install_slice_MainAbilitySlice_stringFromJNI(JNIEnv* env, jobject  obj) {

   std::string string_output;

    cl_int ciErrNum;
    char chBuffer[128];
    cl_uint num_platforms;
    cl_uint num_device;
    cl_platform_id* clPlatformIDs;
    cl_platform_id clSelectedPlatformID = 0;
    cl_device_id  * devices;

    clGetPlatformIDs(0, NULL, &num_platforms);

    clGetPlatformIDs(0, 0, &num_platforms);//first one
    clPlatformIDs = (cl_platform_id*) malloc(sizeof(cl_platform_id) * num_platforms);
    clGetPlatformIDs(num_platforms, clPlatformIDs, NULL);

    clGetDeviceIDs(clPlatformIDs[0], CL_DEVICE_TYPE_GPU, 0, NULL, &num_device);
    devices = (cl_device_id*) malloc(sizeof(cl_device_id) * num_device);
    clGetDeviceIDs(clPlatformIDs[0], CL_DEVICE_TYPE_GPU, num_device, devices, NULL);

    HILOG_INFO(LOG_APP, "Number of devices = %{public}d", num_device);

    clGetPlatformInfo(clPlatformIDs[0], CL_PLATFORM_NAME, sizeof(chBuffer), &chBuffer, NULL);
    string_output.append(chBuffer);
    HILOG_INFO(LOG_APP, "private chBuffer contents = %{public}s", string_output.c_str());

    clGetDeviceInfo(devices[0], CL_DRIVER_VERSION, sizeof(chBuffer), &chBuffer, NULL);
    HILOG_INFO(LOG_APP, "OpenCL Driver version = %{public}s", chBuffer);
    string_output.append(" ");
    string_output.append(chBuffer);

    return env->NewStringUTF(string_output.c_str());
}

运行后在手机端是如此。可见,我的手机是有OpenCL 2.1 的功能。

请添加图片描述
也可以通过DevEco的输出HiLog日志会看到以下的内容:
在这里插入图片描述
成功!😄

下一步

  1. 运行OpenCL的基础程序
  2. FPGA上运行OpenCL
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐