OpenCV,OpenGL,OpenCL,OpenAL,OpenMP…………還有多少OpenXX

      在過去利用GPU對圖像渲染進行加速的技術非常成熟,因爲GPU是典型的單指令多數據(SIMD)的體系結構,擅長大規模的並行計算;而CPU是多指令單數據流(MISD)的體系結構,更擅長邏輯控制。在當今數據量計算越發龐大的情況下,爲了提升計算效率,人們希望將GPU大規模的並行計算的能力擴展到更多領域,而不只侷限與圖像渲染。這樣,CPU只負責邏輯控制,GPU更多負責計算,這種一個CPU(控制單元)+幾個GPU(有時可能再加幾個CPU)(計算單元)的架構就是所謂的異構編程。

OpenCL就是這種情況下出現的,它是一種異構計算的標準,可以用來針對GPU編程。其實在OpenCL出來之前,NVIDIA就推出了GPGPU計算CUDA架構。只不過CUDA只能使用自家的N卡,對其他顯卡不支持,而OpenCL則是一個通用的標準,對A卡,N卡等都支持,還支持CPU計算。

OpenCL:

        OpenCL(全稱Open Computing Language,開放運算語言)是第一個面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境,便於軟件開發人員爲高性能計算服務器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他並行處理器,在遊戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景。

OpenCL是一個爲異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成。旨在充分利用GPU強大的並行計算能力以及與CPU的協同工作,更高效的利用硬件高效的完成大規模的(尤其是並行度高的)計算。在過去利用GPU對圖像渲染進行加速的技術非常成熟,但是我們知道GPU的芯片結構擅長大規模的並行計算(PC級的GPU可能就是CPU的上萬倍),CPU則擅長邏輯控制,因此不只侷限與圖像渲染,人們希望將這種計算能力擴展到更多領域,所以這也被稱爲GPGPU(即通用處計算處理的GPU)。OpenCL由一門用於編寫kernels (在OpenCL設備上運行的函數)的語言(基於C99)和一組用於定義並控制平臺的API組成。OpenCL提供了基於任務分割和數據分割的並行計算機制。

OpenCL類似於另外兩個開放的工業標準OpenGL和OpenAL,這兩個標準分別用於三維圖形和計算機音頻方面。OpenCL擴展了GPU用於圖形生成之外的能力。OpenCL由非盈利性技術組織Khronos Group掌管。

OpenGL:

OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者“開放式圖形庫”)是用於渲染2D、3D矢量圖形的跨語言、跨平臺的應用程序編程接口(API)。這個接口由近350個不同的函數調用組成,用來從簡單的圖形比特繪製複雜的三維景象。而另一種程序接口系統是僅用於Microsoft Windows上的Direct3D。OpenGL常用於CAD、虛擬實境、科學可視化程序和電子遊戲開發。

OpenGL的高效實現(利用了圖形加速硬件)存在於Windows,部分UNIX平臺和Mac OS。這些實現一般由顯示設備廠商提供,而且非常依賴於該廠商提供的硬件。開放源代碼庫Mesa是一個純基於軟件的圖形API,它的代碼兼容於OpenGL。但是,由於許可證的原因,它只聲稱是一個“非常相似”的API。

OpenGL規範由1992年成立的OpenGL架構評審委員會(ARB)維護。ARB由一些對創建一個統一的、普遍可用的API特別感興趣的公司組成。根據OpenGL官方網站,2002年6月的ARB投票成員包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是創立成員之一,但已於2003年3月退出。

OpenCV:

OpenCV(Open Source Computer Vision Library,譯名爲:開源計算機視覺庫)是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。

OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。這些語言的API接口函數可以通過在線文檔獲得。如今也提供對於C#、Ch、Ruby,GO的支持。

所有新的開發和算法都是用C++接口。一個使用CUDA的GPU接口也於2010年9月開始實現。

爲什麼有OpenCV

計算機視覺市場巨大而且持續增長,且這方面沒有標準API,如今的計算機視覺軟件大概有以下三種:

1、研究代碼(慢,不穩定,獨立並與其他庫不兼容)

2、耗費很高的商業化工具(比如Halcon, MATLAB+Simulink)

3、依賴硬件的一些特別的解決方案(比如視頻監控,製造控制系統,醫療設備)這是如今的現狀,而標準的API將簡化計算機視覺程序和解決方案的開發,OpenCV致力於成爲這樣的標準API。

OpenCV致力於真實世界的實時應用,通過優化的C代碼的編寫對其執行速度帶來了可觀的提升,並且可以通過購買Intel的IPP高性能多媒體函數庫(Integrated Performance Primitives)得到更快的處理速度。右圖爲OpenCV與當前其他主流視覺函數庫的性能比較。

OpenMP:

OpenMP(Open multi-platform shared-memory parallel process library,個人譯名爲:開源多平臺共享內存並行處理庫)是由OpenMP Architecture Review Board牽頭提出的,並已被廣泛接受,用於共享內存並行系統的多處理器程序設計的一套指導性編譯處理方案(Compiler Directive) [1]  。OpenMP支持的編程語言包括C、C++和Fortran;而支持OpenMp的編譯器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了對並行算法的高層的抽象描述,程序員通過在源代碼中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程序進行並行化,並在必要之處加入同步互斥以及通信。當選擇忽略這些pragma,或者編譯器不支持OpenMp時,程序又可退化爲通常的程序(一般爲串行),代碼仍然可以正常運作,只是不能利用多線程來加速程序執行。

OpenMP提供的這種對於並行描述的高層抽象降低了並行編程的難度和複雜度,這樣程序員可以把更多的精力投入到並行算法本身,而非其具體實現細節。對基於數據分集的多線程程序設計,OpenMP是一個很好的選擇。同時,使用OpenMP也提供了更強的靈活性,可以較容易的適應不同的並行系統配置。線程粒度和負載平衡等是傳統多線程程序設計中的難題,但在OpenMP中,OpenMP庫從程序員手中接管了部分這兩方面的工作。

但是,作爲高層抽象,OpenMP並不適合需要複雜的線程間同步和互斥的場合。OpenMp的另一個缺點是不能在非共享內存系統(如計算機集羣)上使用。在這樣的系統上,MPI使用較多。

多執行緒的概念

OpenMP是作爲共享存儲標準而問世的。它是爲在多處理機上編寫並行程序而設計的一個應用編程接口。它包括一套編譯指導語句和一個用來支持它的函數庫。

當今雙核、四核的 CPU 當道,而六核的CPU也已經面世多時,所以在多處理機上編寫、運行並行程序會變得相當普遍。

對於一般單一執行緒(single thread)的程式,多核心處理器並沒有辦法提升它的處理效能;不過對於多執行緒(multi thread)的程式,就可以透過不同的核心同時計算,來達到加速的目的了!簡單的例子,以單執行緒的程式來說,一件事做一次要十秒的話,要做十次,都丟給同一顆核心做的話,自然就是 10 秒 * 10 次,也就是 100 秒了;但是以多執行緒的程式來說,它可以把這一件事,分給兩顆核心各自做,每顆核心各做 5 次,所以所需要的時間就只需要 50 秒!

當然,多執行緒的程式實際上沒這麼簡單。在工作的切割、結合上,也是要多花時間的,所以在現實中,即使最佳狀況,雙核心的效能也不會是 1 + 1 = 2 這樣的理想化。除此之外,也不是所有工作都是可以切割的!很多工作是有關聯性的,這樣如果直接切割給不同的處理核心各自去並行運算,出來的結果是肯定有問題的。而且,多執行緒的程式在編寫、維護上,也都比單一執行緒的程式複雜上不少。

不過,如果電腦本身是多處理器多核心處理器,或是處理器擁有像 IntelHyper-ThreadingTechnology 這類的能在同一個時間處理多個執行緒的功能的話,那把各自獨立的工作由單一執行緒改成多執行緒,在執行的效率上,大多還是會有增進的!

多執行緒的程式

寫程序的時候該怎麼去寫多線程的程序呢?一般的方法,就是真的利用線程的控制,去實際在程式中去產生其他的線程來處理。像 POSIX Threads 這套 library,就是用來產生、控制執行緒的函式庫。而像 Microsoft VisualStudio 2005 中,也有提供控制線程的功能。這種方法,大多就是產生多個 thread,而再由主線程把工作拆開,分給子線程去運算,最後再由主線程回收結果、整合。

但是,實際上要去控制線程是蠻麻煩的,在程序的編寫上,也會複雜不少;而如果我們只是想要把一些簡單的循環並行化處理,用線程庫來控制,實在有點殺雞用牛刀的感覺。這時候,用Open MP就簡單多了!OpenMP 是一種能透過高階指令,很簡單地將程式並行化、多線程化的 API;在最簡單的情形,甚至可以只加一行指令,就可以將循環內的程序並行化處理了!

OpenAL:

OpenAL(Open Audio Library,譯名爲:開源音頻庫)是自由軟件界的跨平臺音效API,由Loki Software,使用在Windows、Linux 系統上,用在音效緩衝和收聽中編碼。

OpenAL設計給多通道三維位置音效的特效表現。其 API 風格模仿自OpenGL。

OpenAL 主要的功能是在來源物體、音效緩衝和收聽者中編碼。來源物體包含一個指向緩衝區的指標、聲音的速度、位置和方向,以及聲音強度。收聽者物體包含收聽者的速度、位置和方向,以及全部聲音的整體增益。緩衝裏包含 8 或 16 位元、單聲道或立體聲 PCM 格式的音效資料,表現引擎進行所有必要的計算,如距離衰減、多普勒效應等。

不同於 OpenGL 規格,OpenAL 規格包含兩個API分支;以實際 OpenAL 函式組成的核心,和 ALC API,ALC 用於管理表現內容、資源使用情況,並將跨平臺風格封在其中。還有“ALUT”程式庫,提供高階“易用”的函式,其定位相當於 OpenGL 的 GLUT。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章