OpenMP在ARM-Linux以及NDK中的編譯和使用

      網友投稿 1016 2025-04-02

      OpenMP在ARM-linux以及NDK中的編譯和使用

      參考:http://blog.sina.com.cn/s/blog_602f87700102w1ki.html

      以前對OpenCV在ARM-linux,ARM-Android上的優化做了很多編譯方面的努力,例如添加TBB支持,添加CUDA支持(NvidiaK1平臺上)。這次突然聽同事說增加了OpenMP選項后,在Windows+X86上有極大的優勢,adaboost速度提高3倍。所以趕快在ARM-Android-NDK上測試一下。

      OpenMP在ARM-Linux以及NDK中的編譯和使用

      0. OpenMP基礎:

      OpenMP(OpenMulti-Processing)是由OpenMPArchitecture Review Board牽頭提出的,并已被廣泛接受的,用于

      共享內存

      并行系統的

      多線程

      程序設計的一套指導性注釋(CompilerDirective)。OpenMP支持的

      編程語言

      包括

      C語言

      、

      C++

      Fortran

      ;而支持OpenMP的

      編譯器

      包括

      Sun Studio

      Intel

      Compiler,以及

      開放源碼

      GCC

      Open64

      編譯器。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 ompparallel?僅在您指定了?-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. OpenCV4AndroidOpenMP支持:

      #!/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指令的使用格式為:

      #pragmaomp?指令?[子句[子句]…]

      #pragma omp parallel for

      for (int j = 0; j < 4; j++)

      {

      printf("j=[%d], ThreadId =[%d]\n", j, omp_get_thread_num());

      }

      #endif

      如果報找不到符號,可以:-lgom

      總結一下,在pc上,時間加倍,但是在arm多核上,效果可以,時間減少約50%。

      ARM Linux

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表中減法函數的使用教程
      下一篇:WPS表格制作條形圖的方法步驟詳解(wps條形圖怎么做)
      相關文章
      亚洲av高清在线观看一区二区| 亚洲国产成人精品女人久久久| 久久亚洲精品成人无码| 国产精品亚洲w码日韩中文| 亚洲∧v久久久无码精品| 国产成人亚洲精品播放器下载 | 亚洲A丁香五香天堂网| 亚洲人成片在线观看| 亚洲色无码一区二区三区| 色综合久久精品亚洲国产| 亚洲精品国产肉丝袜久久| 亚洲女久久久噜噜噜熟女| 亚洲精品一卡2卡3卡四卡乱码| 亚洲国产视频网站| 亚洲AV中文无码字幕色三| 激情小说亚洲色图| 亚洲精品综合在线影院| 亚洲AV综合色一区二区三区| 亚洲成年看片在线观看| 亚洲AV成人无码天堂| 亚洲国产精品久久久久| 亚洲人成色7777在线观看不卡| 亚洲丰满熟女一区二区哦| 亚洲精品成人网站在线播放| 日韩va亚洲va欧洲va国产| 国产精品亚洲一区二区三区 | 亚洲综合国产成人丁香五月激情| 久久亚洲AV成人无码电影| 亚洲综合另类小说色区色噜噜| 亚洲自偷自偷在线成人网站传媒| 亚洲AV无码国产丝袜在线观看| 亚洲乱码中文字幕手机在线| 亚洲avav天堂av在线网毛片| 亚洲1区1区3区4区产品乱码芒果| 亚洲日本精品一区二区| 亚洲综合精品香蕉久久网| 亚洲高清视频一视频二视频三| 亚洲偷自拍另类图片二区| 亚洲精品二三区伊人久久| 亚洲天天在线日亚洲洲精| 亚洲人成亚洲人成在线观看|