前言
之前谈到如何使用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目录的libs
和include
文件夹放在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日志会看到以下的内容:
成功!😄
下一步
- 运行OpenCL的基础程序
- FPGA上运行OpenCL