• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.so28
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.so48
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![image1](./figures/omp-result.png)
158
159> **注意:**
160>
161> OpenMP程序运行时,Hilog中会输出“dlopen_impl load library header failed for libarcher.so”的报错信息(如下图)。该报错信息中提到的libarcher.so,在OpenMP程序开启Tsan检测时才需要使用。目前OpenHarmony未支持OpenMP程序的Tsan检测能力,因此该错误信息可忽略,不影响程序正常运行。
162>
163> ![image2](./figures/omp-error.png)
164