我目前正在使用 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
我遇到了完全相同的问题,编译没有错误,但应用程序在启动时立即崩溃。
原来你需要使用“-static-openmp -fopenmp”标志。你的构建 gradle 基本上看起来像这样:
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=ON"
cppFlags "-static-openmp -fopenmp"
}
尝试在我的应用程序的 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 时在启动时崩溃。