1# OpenMP应用构建和运行指南 2<!--Kit: NDK Development--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @yangming4249--> 5<!--Designer: @ychen3---> 6<!--Tester: @zsw_zhushiwei--> 7<!--Adviser: @fang-jinxu--> 8 9OpenHarmony NDK中提供了OpenMP的动态库和静态库文件,支持开发者在Native应用中使用OpenMP。本文用于指导开发者在[DevEco Studio](https://developer.huawei.com/consumer/cn/deveco-studio/)中调用库文件使用OpenMP的并行化能力,更详细的使用示例和API标准请查看官方文档[clang-OpenMPSupport](https://clang.llvm.org/docs/OpenMPSupport.html)。 10 11## 开发步骤 12 13### 1. 创建Native C++工程 14[创建NDK工程](./create-with-ndk.md) 15 16### 2. 添加依赖 17 18OpenMP库的引入可以通过静态链接和动态链接两种方式实现。 19 20> **注意:** 21> 22> [OMPT(OpenMP Tools Interface)](https://www.openmp.org/spec-html/5.0/openmpsu15.html#x25-240001.5.1)工具目前仅支持静态链接时使用。 23> 24 25**静态链接** 26 27(1)打开entry/src/main/cpp/CMakeLists.txt,在target\_link\_libraries依赖中添加静态库libomp.a以及日志依赖libhilog\_ndk.z.so。 28 29```makelists 30target_link_libraries(entry PUBLIC libomp.a libace_napi.z.so libhilog_ndk.z.so) 31``` 32 33(2)打开entry/build-profile.json5,在buildOption->externalNativeOptions->cppFlags下添加编译参数"-static-openmp -fopenmp"。 34 35``` 36"buildOption": { 37 "externalNativeOptions": { 38 "path": "./src/main/cpp/CMakeLists.txt", 39 "arguments": "", 40 "cppFlags": "-static-openmp -fopenmp", 41 } 42 } 43``` 44 45**动态链接** 46 47(1)打开entry/src/main/cpp/CMakeLists.txt,在target\_link\_libraries依赖中添加动态库libomp.so以及日志依赖libhilog\_ndk.z.so。 48 49```makelists 50target_link_libraries(entry PUBLIC libomp.so libace_napi.z.so libhilog_ndk.z.so) 51``` 52 53(2)打开entry/build-profile.json5,在buildOption->externalNativeOptions->cppFlags下添加编译参数"-fopenmp"。 54 55``` 56"buildOption": { 57 "externalNativeOptions": { 58 "path": "./src/main/cpp/CMakeLists.txt", 59 "arguments": "", 60 "cppFlags": "-fopenmp", 61 } 62 } 63``` 64 65(3)打开Sdk安装目录,在“{Sdk安装目录}\{版本号}\openharmony\native\llvm\lib\aarch64-linux-ohos”目录下找到libomp.so动态库文件,并将其拷贝到工程目录entry/libs/arm64-v8a文件夹。 66 67### 3. 修改源文件 68 69(1)修改entry/src/main/cpp/napi_init.cpp,引入omp.h头文件,并添加OmpTest函数。 70 71```cpp 72#include "napi/native_api.h" 73#include "omp.h" 74#include "hilog/log.h" 75 76#undef LOG_DOMAIN 77#undef LOG_TAG 78#define LOG_DOMAIN 0x3200 // 全局domain宏,标识业务领域 79#define LOG_TAG "MY_TAG" // 全局tag宏,标识模块日志tag 80 81static napi_value OmpTest(napi_env env, napi_callback_info info) 82{ 83 84 OH_LOG_INFO(LOG_APP, "=================Hello OpenMP test.===================="); 85 #pragma omp parallel 86 { 87 OH_LOG_INFO(LOG_APP, "Hello OpenMP!"); 88 } 89 return nullptr; 90} 91 92EXTERN_C_START 93static napi_value Init(napi_env env, napi_value exports) 94{ 95 napi_property_descriptor desc[] = { 96 { "ompTest", nullptr, OmpTest, nullptr, nullptr, nullptr, napi_default, nullptr } 97 }; 98 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 99 return exports; 100} 101EXTERN_C_END 102 103static napi_module demoModule = { 104 .nm_version = 1, 105 .nm_flags = 0, 106 .nm_filename = nullptr, 107 .nm_register_func = Init, 108 .nm_modname = "entry", 109 .nm_priv = ((void*)0), 110 .reserved = { 0 }, 111}; 112 113extern "C" __attribute__((constructor)) void RegisterEntryModule(void) 114{ 115 napi_module_register(&demoModule); 116} 117 118``` 119 120(2)修改entry/src/main/cpp/types/libentry/Index.d.ts,导出ompTest函数。 121 122```TS 123export const ompTest: () => null; 124``` 125 126(3)Ts侧调用,修改entry/src/main/ets/pages/Index.ets,调用ompTest函数。 127 128```TS 129import testNapi from 'libentry.so'; 130 131@Entry 132@Component 133struct Index { 134 @State message: string = 'Hello OpenMP'; 135 136 build() { 137 Row() { 138 Column() { 139 Text(this.message) 140 .fontSize(50) 141 .fontWeight(FontWeight.Bold) 142 .onClick(() => { 143 testNapi.ompTest(); 144 }) 145 } 146 .width('100%') 147 } 148 .height('100%') 149 } 150} 151``` 152 153### 4. 运行并校验结果 154 155运行前请检查设备连接并配置好[Signature](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)信息。直接点击右上角运行按钮,应用启动后设备进入“Hello OpenMP”界面,点击“Hello OpenMP”标签,打开DevEco Studio下方“Log”查看页面,即可看到并行打印的“Hello OpenMP!”消息。 156 157 158 159> **注意:** 160> 161> OpenMP程序运行时,Hilog中会输出“dlopen_impl load library header failed for libarcher.so”的报错信息(如下图)。该报错信息中提到的libarcher.so,在OpenMP程序开启Tsan检测时才需要使用。目前OpenHarmony未支持OpenMP程序的Tsan检测能力,因此该错误信息可忽略,不影响程序正常运行。 162> 163>  164