如何在 android 原生代码中并行运行 OpenMP?

问题描述 投票:0回答:2

我目前正在使用 OpenMP 的#pragma 将 Android 应用程序的本地循环代码分发到并行线程,如下所示:

#pragma omp parallel shared(variable1) shared(variable2) shared(variable3) private(array_1) private(array_1) private(array_1)
{
    LOG(INFO) << "Running inside thread:  " << omp_get_thread_num();
    #pragma omp for
    for (int c = 1; c <= itrloopLim; c++) {
        ...
    }
}

我正在使用

-fopenmp
进行编译,但是在安装 .apk 之后,应用程序在运行时崩溃并出现以下错误:

12-06 23:30:58.700 32133 32314 W System.err: TensorFlowLite: failed to load native library: dlopen failed: cannot locate symbol "__kmpc_end_critical" referenced by "/data/app/org.mlperf.inference-aKoP_FhySRDbKCU5EeEcmQ==/lib/arm64/libmlperf_jni.so"...
12-06 23:30:58.700 32133 32314 E lperf.inferenc: No implementation found for void org.mlperf.inference.MLPerfDriverWrapper.nativeDeleteBackend(long) (tried Java_org_mlperf_inference_MLPerfDriverWrapper_nativeDeleteBackend and Java_org_mlperf_inference_MLPerfDriverWrapper_nativeDeleteBackend__J)
12-06 23:30:58.701 32133 32314 E AndroidRuntime: FATAL EXCEPTION: MLPerf.Worker
12-06 23:30:58.701 32133 32314 E AndroidRuntime: Process: org.mlperf.inference, PID: 32133
12-06 23:30:58.701 32133 32314 E AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for void org.mlperf.inference.MLPerfDriverWrapper.nativeDeleteBackend(long) (tried Java_org_mlperf_inference_MLPerfDriverWrapper_nativeDeleteBackend and Java_org_mlperf_inference_MLPerfDriverWrapper_nativeDeleteBackend__J)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at org.mlperf.inference.MLPerfDriverWrapper.nativeDeleteBackend(Native Method)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at org.mlperf.inference.MLPerfDriverWrapper.access$000(MLPerfDriverWrapper.java:23)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at org.mlperf.inference.MLPerfDriverWrapper$Builder.useMLBackend(MLPerfDriverWrapper.java:205)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at org.mlperf.inference.RunMLPerfWorker.handleMessage(RunMLPerfWorker.java:102)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:193)
12-06 23:30:58.701 32133 32314 E AndroidRuntime:        at android.os.HandlerThread.run(HandlerThread.java:65)
12-06 23:30:58.703  1439  1467 W ActivityManager:   Force finishing activity org.mlperf.inference/.MLPerfEvaluation


12-06 23:30:58.707  1439  1585 I ActivityManager: Showing crash dialog for package org.mlperf.inference u0
12-06 23:30:58.715  1439  1584 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.stats.service.DropBoxEntryAddedReceiver
android-ndk openmp
2个回答
0
投票

我遇到了完全相同的问题,编译没有错误,但应用程序在启动时立即崩溃。

原来你需要使用“-static-openmp -fopenmp”标志。你的构建 gradle 基本上看起来像这样:

    externalNativeBuild {
        cmake {
            arguments "-DANDROID_ARM_NEON=ON"
            cppFlags "-static-openmp -fopenmp"
        }

0
投票

尝试在我的应用程序的 build.gradle 文件中包含

-fopenmp -static-openmp
标志 (
ndk 23.1.7779620
),我遇到了以下错误:
warning: argument unused during compilation: '-static-openmp' [-Wunused-command-line-argument]
正如其他人提到的那样。

我按照 android ndk 测试代码中包含的链接步骤设法解决了这个问题 (https://android.googlesource.com/platform/ndk/+/master/tests/device/openmp/CMakeLists.txt) .因此,我没有将相关标志添加到我的 build.gradle 文件中,而是将以下内容添加到外部原生构建 CMakeLists.txt:

target_link_libraries(mycppLib -fopenmp -static-openmp )
target_compile_options(mycppLib -fopenmp)

我可以确认静态 libomp.a 是与应用程序一起编译的,这使得使用 libomp.so 运送应用程序变得不必要,正如包含

-static-openmp
标志所预期的那样。 请注意,如果没有
-static-openmp
标志,应用程序可能会在无法加载 libomp.so 时在启动时崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.