OpenMP在ARM-Linux以及NDK中的编译和使用_openmp 编译移植到arm-程序员宅基地

技术标签: GPGPU  

以前对OpenCV在ARM-Linux, ARM-Android上的优化做了很多编译方面的努力,例如添加TBB支持,添加CUDA支持(Nvidia K1平台上)。这次突然听同事说增加了OpenMP选项后,在Windows+X86上有极大的优势,adaboost速度提高3倍。所以赶快在ARM-Android-NDK上测试一下。

 

 

0. OpenMP基础:

OpenMP(Open Multi-Processing)是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP支持的编程语言包括C语言C++Fortran;而支持OpenMP的编译器包括Sun StudioIntel Compiler,以及开放源码GCCOpen64编译器。OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

 

1. OpenMP在X86 Linux上的展现:

例子代码:

#include
int main(int argc, char* argv[])
{

#pragma omp parallel

printf("Hello, world.\n");
return 0;
}

普通编译:

g++ OpenMP_Test.cpp -o test

运行:

# ./test
Hello, world.

 

增加OpenMP 编译选项的编译:

 g++ -fopenmp OpenMP_Test.cpp -o test

运行:

#./test
Hello, world.
Hello, world.
Hello, world.
Hello, world.

证明-fopenmp 在GCC下有效。代码的OpenMP能力得到支持。

#pragma omp parallel 仅在您指定了 -fopenmp 编译器选项后才会发挥作用。在编译期间,GCC 会根据硬件和操作系统配置在运行时生成代码,创建尽可能多的线程。每个线程的起始例程为代码块中位于指令之后的代码。这种行为是 隐式的并行化,而 OpenMP 本质上由一组功能强大的编译指示组成,帮您省去了编写大量样本文件的工作。我的Linux机器为4核CPU。所有有4个thread. 

 

 

2. OpenMP在ARM-Anrdoid-NDK上的展现:

代码不变。

Android.mk内容如下:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := test
LOCAL_SRC_FILES := OpenMP_Test.cpp

 

 

LOCAL_CXXFLAGS := -fopenmp
LOCAL_CFLAGS +=  -fopenmp
LOCAL_LDLIBS := -llog -fopenmp
include $(BUILD_EXECUTABLE)

 

Application.mk内容如下:

# Build both ARMv5TE and ARMv7-A machine code.
APP_PLATFORM = android-8

APP_ABI := armeabi-v7a
#APP_ABI := $(ARM_ARCH)

#Sam modify it to release
#APP_OPTIM := release
APP_OPTIM := debug
#APP_OPTIM = $(MY_OPTIM)

APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -frtti

#sam modify it from gnustl_static to gnustl_shared
#APP_STL := gnustl_static
#APP_STL        := gnustl_shared
APP_STL := gnustl_shared

#APP_CPPFLAGS += -fno-rtti


#
APP_CPPFLAGS += -Dlinux -fsigned-char
APP_CFLAGS += -fsigned-char
#APP_CPPFLAGS += $(MY_CPPFLAGS) -Dlinux
#STLPORT_FORCE_REBUILD := true

 

编译后运行:

$ ./test                                      
Hello, world.
Hello, world.
Hello, world.
Hello, world.

证明-fopenmp 在NDK下有效。代码的OpenMP能力得到支持。

K1平台是4 Core的。所以有4个thread. 

 

3. OpenCV4Android OpenMP支持:

#!/bin/sh
cd `dirname $0`/..

mkdir -p build_android_arm
cd build_android_arm

cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DHAVE_EIGEN=1  -DHAVE_CAMV4L2=ON -DBUILD_TBB=ON -DWITH_TBB=ON -DHAVE_OPENMP=1 -DBUILD_EXA
MPLES=1 -DANDROID_ABI="armeabi-v7a"  -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake $@ ../..

只要如此编译,则OpenCV 支持OpenMP.

 

4. OpenMP 指令和库函数:

 C/C++中,OpenMP指令的使用格式为:

pragma omp 指令 [子句[子句]…]

#pragma omp parallel for
     for (int j = 0; j < 4; j++)
  {
         printf("j=[%d], ThreadId =[%d]\n", j, omp_get_thread_num());
     }
#endif

 

如果报找不到符号,可以: -lgomp

 

 

5. OpenCV(support OpenMP)效果测试:

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Tommy_wxie/article/details/53244314

智能推荐

STM32芯片的ADC引脚的识别与选择_adc12_in4-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏26次。1、以STM32F103ZET6芯片为例,ADC引脚分布为:2、可以看出,一共有IN0--IN15,16个ADC通道,通道IN0--IN9与芯片的其他功能复用了引脚。通道IN10--IN15是ADC独立的引脚。 且ADC1和ADC2有IN0--IN15 16个ADC通道。 而ADC3只有IN0、IN1、IN2、IN3、IN10、IN11、IN12、IN13通道。 ADC123_IN0表示ADC1、ADC2、ADC3都有通道IN0。 ADC12_IN4表示只有A..._adc12_in4

webpack test-程序员宅基地

文章浏览阅读1.3k次。webpack test_webpack test

java批量修改文件名后缀_java修改文件后缀名-程序员宅基地

文章浏览阅读1.4k次。java批量修改文件后缀名_java修改文件后缀名

jeecgboot按字段分表_jeecgboot 分表-程序员宅基地

文章浏览阅读1.3k次。在jeecgboot 使用mybatis框架,mybatis-plus3.1.1后支持分表,以下是在jeecg项目中实行分表一、修改mybatis-plus版本后,必须要在3.1.1版本后 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-..._jeecgboot 分表

java字符串_gags69zzww-程序员宅基地

文章浏览阅读353次。一、字符串的特性:String 被声明为 final,因此它不可被继承。二、不同JDK版本中String的区别:①: 在 Java 8 中,String 内部使用 char 数组存储数据。②: 在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 coder 来标识使用了哪种编码。value 数组被声明为 final,这意味着 value 数组初始化之..._gags69zzww

虚拟机在PE系统下看不到硬盘_pe虚拟系统盘-程序员宅基地

文章浏览阅读9.2k次。故障说明:想在VM虚拟化系统里进入PE重置密码,结果PE系统看不到一个硬盘,空空荡荡的。解决方法:先在虚拟机设置里面看看SCSI控制器的当前类型,如果是准虚拟的情况下,就更改SAS类型即可更改SAS类型最后重新进入PE即可看到硬盘,更改这个参数并不会影响系统。..._pe虚拟系统盘

随便推点

航空航天数值分析matlab算法,数值分析 matlab-程序员宅基地

文章浏览阅读501次。"本书介绍数值方法的基本理论和计算方法,并讲述如何利用MATLAB软件实现各种数值算法。它的突出特点是把经典的数值方法内容与现代MATLAB计算软件相结合,书中每个概念均以实例说明,同时还包含大量习题与编程练习,通过这些实例提高读者的实践能力,并加深对数值计算方法的理解。本书经过缩编后适合一学期课"¥63.96定价:¥487.90(1.32折)1. 精心提炼数百个典型实例,全部源于作者的实际工作和..._数值分析在航空领域的应用

Zookeeper权限管理与Quota管理_zookeeper ip 和quota ip-程序员宅基地

文章浏览阅读598次。1 Zookeeper ACLZooKeeper的权限管理亦即ACL控制功能通过Server、Client两端协调完成:Server端:一个ZooKeeper的节点(znode)存储两部分内容:数据和状态,状态中包含ACL信息。创建一个znode会产生一个ACL列表,列表中每个ACL包括:l 验证模式(scheme)l 具体内容(Id)(当scheme=“digest”时,Id为用户名密码,例..._zookeeper ip 和quota ip

ocr数据集:图片数据集_ocr 图片集-程序员宅基地

文章浏览阅读684次。数据集数据集总数量为370万张图片图片数据集文件介绍测试数据集_ocr 图片集

python识图自动化_聊聊 Python 自动化截图的一些经验-程序员宅基地

文章浏览阅读357次。前言今天想先给大家分享 1 个小白用户的 Airtest 从入门到放弃的故事小 A 是一个自动化的小白,在逛测试论坛的时候,偶然间发现了 Airtest 这个基于图像识别的 UI 自动化框架出于好奇,小 A 试用了这个框架,发现只需要几条简单的截图脚本,就可以对设备进行各种自动化操作,于是小 A 成功种草了这个框架但几天之后,随着小 A 的深入使用,他发现截图脚本并不是他想象中那么“完美”;有时..._python识图框架

python语言的关键字是什么_Python语言的关键字有哪些特点?关键字列举-程序员宅基地

文章浏览阅读272次。在Python中,具有特殊功能的标识符称为关键字。关键字是Python语言自己已经使用的了,不允许开发者自己定义和关键字相同名字的标识符。Python中的关键字如下所示:FalseawaitelseimportpassNonebreakexceptinraiseTrueclassfinallyisretu..._python语言的关键字有哪些

pandas数据处理之groupby的常用用法_pandas怎么处理groupby的结果-程序员宅基地

文章浏览阅读2.8k次。groupby的数据处理简单用法groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)1、by:mapping, function, str, or iterable。用于确定gro..._pandas怎么处理groupby的结果