宁波 做网站的,网络营销推广策略,163邮箱 wordpress,网站建设价格优惠本文主要介绍如何在一个常规的Android手机上调试OpenMP程序#xff0c;包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 #x1f3ac;个人简介#xff1a;一个全栈工程师的升级之路#xff01; #x1f4cb;个人专栏#xff1a;高性能#… 本文主要介绍如何在一个常规的Android手机上调试OpenMP程序包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 个人简介一个全栈工程师的升级之路 个人专栏高性能HPC开发基础教程 CSDN主页 发狂的小花 人生秘诀学习的本质就是极致重复! 目录
一、前言
1 Android NDK
2 Android NDK 环境配置
2.1 Android NDK下载
2.2 Android NDK 环境变量配置
二、项目实战
1 使用JNI配置C/C项目编写OpenMP程序
2 OpenMP 环境引入
3 项目执行
4 运行结果 一、前言 OpenMP是一个支持多平台的共享内存的并行编程接口现在绝大多数的Android都支持OpenMP并行编程。基于移动边缘计算设备的并行计算有着重要的意义受限于体积、功耗、算力在移动设备上进行并行编程有很大的商业价值。
1 Android NDK Android NDK全称Native Development Kit是一套专为Android平台设计的工具开发包。它主要用于帮助开发者使用C、C等语言编写本地代码实现部分应用的功能同时也支持代码库的复用。例如一些性能要求较高的功能如图形处理、音频处理和视频处理等就可以通过NDK来实现以提高运行效率。
除此之外NDK还具备将动态链接库so和应用一起打包成APK的功能从而使得应用程序更加紧凑减少对设备存储空间的占用。 NDK提供了众多平台库开发者可以使用这些库来管理原生Activity和访问实体设备组件例如传感器和触控输入。这对于在特定情况下提高性能特别是像游戏这种计算密集型应用的情况特别有用。 Android NDK 官网 Android NDK 官网 。
2 Android NDK 环境配置
2.1 Android NDK下载 本文仅仅介绍在Ubuntu18 上进行OpenMP包含Android NDK的安装编程Ubuntu18以上应该都支持。笔者使用NDK21进行编译下载地址为NDK21 下载后解压。
2.2 Android NDK 环境变量配置 找到ndk-build 路径将其添加到bashrc中 export NDK/home/hubery/Downloads/android-ndk-r21e-linux-x86_64/android-ndk-r21e 这样NDK环境就配置好了使用时仅仅需要使用如下代码将NDK添加到环境变量中 source ~/.bashrc 二、项目实战
1 使用JNI配置C/C项目编写OpenMP程序 1项目结构 项目名称openmp_hu demo文件夹存放OpenMP程序文件支持C语言和C jni文件夹Android JNI项目文件夹内部含有Android.mk和Application.mk 用来构建整个适配JNI的项目。 thirdParty文件夹第三方库适配Android 的OpenMP库我这里手机是64位的ARM直接去下载解压后的Android NDK文件夹寻找使用64位的aarch64架构将其复制到thirdParty文件夹下如下
其他文件是将编译生成的可执行文件和库push到Android系统中和运行可执行程序、清理生成的过程文件的。 (2文件介绍 openmpDemo.c #include stdio.h
#include omp.hint main()
{#pragma omp parallel forfor (int i 0;i 8;i){printf(ThreadID: %d i: % d \n,omp_get_thread_num(),i);}return 0;} Android.mk LOCAL_PATH : $(call my-dir)
include $(CLEAR_VARS)
# 第三方库的引用
LOCAL_MODULE : omp
LOCAL_SRC_FILES : ../thirdParty/libomp.so
include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)
# ARM 平台
LOCAL_ARM_MODE : arm
# C引入openmp
LOCAL_CXXFLAGS : -fopenmp
# C引入openmp
LOCAL_CFLAGS -fopenmp
# 一些其他库
LOCAL_LDLIBS : -llog -landroid
# 链接openmp
LOCAL_LDFLAGS -fopenmpLOCAL_MODULE : openmpDemo
LOCAL_SRC_FILES : ../demo/openmpDemo.c
LOCAL_MULTILIB : 64
include $(BUILD_EXECUTABLE) Application.mk APP_ABI : arm64-v8a
APP_STL : c_static # for using STL
APP_PLATFORM : android-29 clean.sh rm -rf libs/ obj/ output/ openmpDemo.sh LOCAL_ROOT_PATH${PWD}
${NDK}/ndk-build clean
${NDK}/ndk-buildadb devicesadb shell rm -f /data/local/tmp/openmpDemo /data/local/tmp/libomp.so /data/local/tmp/runOpenMP.shadb push libs/arm64-v8a/libomp.so /data/local/tmp/
adb push libs/arm64-v8a/openmpDemo /data/local/tmp/
adb push ./runOpenMP.sh /data/local/tmp
adb shell chmod x /data/local/tmp/openmpDemo
adb shell chmod x /data/local/tmp/libomp.so
adb shell chmod x /data/local/tmp/runOpenMP.sh
adb shell /data/local/tmp/runOpenMP.sh
sh ${LOCAL_ROOT_PATH}/clean.shrunOpenMP.sh export LD_LIBRARY_PATH/data/local/tmp
./data/local/tmp/openmpDemo2 OpenMP 环境引入 Android.mk中引入分为两步 1找到适配ARM64位架构的libomp.so 引入编译成共享库 2链接库和编译选项 include $(CLEAR_VARS)
LOCAL_MODULE : omp
LOCAL_SRC_FILES : ../thirdParty/libomp.so
include $(PREBUILT_SHARED_LIBRARY)LOCAL_CXXFLAGS : -fopenmp
LOCAL_CFLAGS -fopenmp
LOCAL_LDFLAGS -fopenmp 3 项目执行 执行前记得将Android手机设置为开发者模式允许adb的使用。如下指令编译运行程序 source ~/.bashrcsh openmpDemo.sh 4 运行结果 分析运行结果可以看出执行成功有7个线程但是笔者有是8核手机很奇怪不知道另一个核为什么一直用不上。 我的分享也就到此结束啦 如果我的分享也能对你有帮助那就太好了 若有不足还请大家多多指正我们一起学习交流 未来的富豪们点赞→收藏⭐→关注如果能评论下就太惊喜了 感谢大家的观看和支持最后☺祝愿大家每天有钱赚 下一节将对OpenMP编程进行更深入的编程实战详解