丁科,譚營
(1.北京大學 機器感知與智能教育部重點實驗室,北京100871;2.北京大學 信息科學技術學院,北京100871)
GPU通用計算(general purpose computing on GPUs,GPGPU)是一種利用圖形處理器(graphics processing unit,GPU)解決通用計算任務的異構計算方式。
最初的GPU只是功能專一的協處理器,用以幫助中央處理器(central processing unit,CPU)從繁重的圖形圖像處理任務中解脫出來。為滿足人們對圖像處理實時性和精確度不斷高漲的需求,在過去的十多年間,GPU的體系結構和制造工藝都取得了長足的進步;GPU的計算性能及計算精度都得到了大幅提升。如今,GPU的浮點計算能力早已遠超同時期的CPU。
圖像處理任務具有高度并行的特點,這使得GPU從誕生之日起,便采用多核心的設計方案。隨著GPU性能的不斷增強和可編程性的日漸提高,GPU的用途不再局限于傳統的圖形圖像處理。目前,GPU已經廣泛應用于從小到圖像解碼,大到超級計算機的各種計算領域,進入到了高性能計算的主流行列。
Owens等[1-2]全面綜述了 2007 年之前的 GPU通用計算的進展情況。然而,在過去的幾年里,GPU軟硬件條件都發生了極大的發展變化。GPU高級編程平臺,如CUDA、OpenCL等的出現,更是使得GPU通用計算的面貌發生了深刻的變化。
本文在已有文獻綜述的基礎上,總結了GPU通用計算領域最新的軟硬件發展及在計算智能領域的應用。文章首先介紹GPU通用計算出現的背景,包括傳統CPU面臨的困難與挑戰以及GPU作為通用計算器件的特點與優勢。接著,文章回顧GPU通用計算開發工具和平臺的發展歷程。然后,本文轉向GPU通用計算的現狀,重點介紹主流的GPU編程平臺——NVIDIA GPU專屬的CUDA平臺和開放標準的OpenCL平臺。GPU通用計算的主要在計算智能領域的重要應用將在之后予以介紹。最后,文章對GPU通用計算的目前存在的挑戰及未來發展趨勢進行展望。
CPU是計算機系統的核心部件,它為各種任務提供計算能力,是一種通用的計算單元。CPU的計算能力可以用每秒鐘執行指令數(instructions per second,IPS)來衡量,而IPS則是由CPU的指令吞吐量(instructions per clock,IPC)和時鐘頻率F所共同決定的:

為了提高CPU的性能,可以從兩方面入手:增加指令吞吐量(IPC)和提高時鐘頻率(F)。
隨著制作工藝的不斷提高,CPU芯片的集成度越來越高[3]。一方面,在集成度更高的芯片中,各個單元在物理上更加靠近,從而可以使器件運行在更高的頻率上。另一方面,更多的晶體管也使得設計更復雜精細的邏輯控制結構,以提高單位時鐘周期的指令吞吐量。
在經過了多年的發展之后,這2種策略都遭遇到了巨大的瓶頸。時鐘頻率的提高使得芯片消耗的功率密度(W/cm2)隨之提高,供電和散熱即將達到某些基本的物理極限。如圖1所示,CPU的時鐘頻率在經歷了長期高速增長后,其提升勢頭難以為繼。
通過復雜的邏輯結構提高指令吞吐量也逐漸達到了收益遞減點。現代處理器的內部結構已經十分復雜,并已經能夠從指令流中壓榨出大量的并行性。通過設計更復雜的結構來提高指令的執行能力變得更加困難[3]。

圖1 CPU時鐘頻率變化趨勢Fig.1 The tendency of CPU’s frequency
為應對上述困難,多核解決方案被提出,以便充分利用晶體管數量的增加,進一步改善CPU。
事實上,2004之后,主要的CPU廠商如Intel和AMD等相繼轉移到多核解決方案,多核計算時代已全面到來。
GPU最初是為了加速圖形處理而設計的專用硬件。圖形渲染等任務具有很強的并行性,需要密集的計算與巨大的數據傳輸帶寬。因此,GPU從誕生之日起便被設計為擁有眾多核心,具有高吞吐量的計算。并且,由于GPU的專用性,GPU芯片的晶體管也更多的用于計算,而非控制和緩存(如圖2所示)。由于GPU與CPU在設計上存著巨大的差別,GPU通用計算有著自身的特點與優勢。
1)計算能力強大
與CPU相比,GPU具有更加強大的計算能力。在相同時期,GPU的浮點計算的理論峰值能力相比CPU要高出一個數量級[6]。
強大的計算能力使GPU在高性能計算領域獲得了廣泛的應用。在全球最快的超級計算機之中,中國國家超級計算天津中心的天河1A號超級計算機和美國橡樹嶺實驗室的TITAN號超級計算機,都是依靠裝配GPU來提升性能,并提供大部分運算能力。GPU為高性能計算提供了新的巨大的發展潛能。

圖2 GPU的晶體管更多的用于計算單元Fig.2 GPUs devote more transistors to data processing
2)廉價易得
相比與基于CPU的計算機系統,GPU更加廉價,也更容易為個人和小型機構所利用。
以NVIDIA的旗艦版GPU TITAN為例。TITAN GPU價格不足一萬元人民幣,共有2 688個計算核心,雙精度浮點運算理論峰值計算能力達到1 500 GFLP/s,額定功耗約為250 W。作為對比,北京大學理論與應用地球物理研究所的集群,由1個服務器(Dell PowerEdge R710)、46個計算結點(Dell PowerEdge M610)、3個刀片機箱(Dell PowerEdge M1000)組成。每個計算結點有2顆四核Intel Xeon E5520(2.26 GHz,Nehalem-EP 架構)處理器,共 368個計算核心,理論計算峰值3 327 GFLP/s,滿載功耗約為12 kW。
可以看到,在提供相同數量級的計算能力的情況下,GPU非常的廉價,也易于裝配(只需要一臺能夠支持獨立顯卡的PC),個人和小型實驗室都有條件利用。而集群等傳統高性能計算設備,不但價格昂貴,對場地、供電和維護等有較高的要求??梢哉f,GPU為PC提供了小型集群的計算能力[7]。
3)開發靈活
現代的GPU都采用統一渲染架構,具有很強的可編程性。GPU編程的軟件開發平臺也趨于成熟,CUDA、OpenCL等工具的推出,使開發者能夠使用高級編程語言為GPU開發通用計算程序。現在主流的GPU也對單精度和雙精度浮點運算提供了滿足IEEE標準的完全支持。對于GPU編程,我們會在下面的章節詳細介紹。
最初的GPU功能固定,只能執行圖形流水線中的特定任務,缺乏可編程性。此時,為了利用GPU進行通用計算,必須將計算任務封裝成圖形處理任務,然后交由GPU完成。這可以通過底層的匯編命令(低級著色語言)編程實現。更為高效的,通常我們可以通過諸如OpenGL、Cg等圖形編程接口,利用高級著色語言(shading language,SL)進行編程。
但即使利用高級著色語言,這種方式也還存在諸多不便。首先,開發者需要熟悉圖形處理的流程,掌握一系列圖形處理接口,并且需要以與任務完成完全無關的一套圖形處理思路來考慮問題的編程求解。其次,圖形接口是專用的程序接口,缺乏通用計算所需要的靈活性,開發者必須面臨如何將問題重新表述成圖形處理問題的挑戰。
為了簡化GPU編程,具有更高層硬件層次的編程模式被相繼提出。GPU的統一著色器被抽象為與具體硬件無關的、能夠以特定方式并行執行線程的流處理器單元。GPU的內存、紋理緩存等存儲單元,被抽象為具有層級結構的存儲體系。經過抽象后,可以在流處理模式下,利用高級語言為GPU編寫程序,完成通用的計算任務。
本節首先介紹與GPU通用計算密切相關的流處理模式。之后,轉向介紹基于流行的GPU編程語言和工具。
流處理模式(stream programming model)是一種類似于單指令多數據(SIMD)的編程模式。
通過將數據組織成數據流,將計算表達成作用于數據流的核函數的方式,流處理能夠暴露程序中內在的并行性。通過流處理模式,程序開發者能夠更容易地利用GPU、FGPA等計算硬件的并行能力而不用顯式地處理空間分配、同步和計算單元間的通信等問題。對于數據并行性良好的應用,流處理能夠取得良好的性能[8]。
如圖3所示,流處理與SIMD最大的不同之處在于,SIMD是以指令為操作單位的,而流處理模式則是以指令序列(核函數)為操作單元。數據流(輸入流)與核函數一同進入流處理器,流中每個數據元素同時被核函數執行,從而完成指定的操作,得到輸出數據(輸出流)。

圖3 流處理與SIMDFig.3 Stream processing and SIMD
流(stream)和核函數(kernel)是流處理模式中最重要的2個概念。流是一個數據集合,包含待處理的數據元素,并且這些數據的處理方式是相同或相似的。核函數是由若干操作(指令)組成的操作序列,它決定著要對每個數據做何種操作和處理。對GPU平臺而言,紋理單元充當了流的角色,待處理數據需要作為2維的紋理信息被流處理器讀取和操作。許多問題也可以很自然的映射為2維的紋理,如矩陣代數、物理仿真等等;而可編程著色器則起著核函數的作用。
Brook是一種基于標準C語言的流編程語言。它旨在基于流編程模式,對圖形API進行封裝,將GPU視為能夠進行并行計算的協處理器,從而簡化GPU通用計算的編程[8]。
Brook使人們看到了將GPU用于通用計算的巨大潛力,對GPU通用計算的發展有著深遠的影響。Brook將GPU封裝為通用的并行處理器的思想及語言規范更是為現在主流的GPU編程平臺CUDA和OpenCL所借鑒,而這兩者正是現在GPU編程的主流開發平臺。
OpenACC是一個異構并行計算標準。與OpenMP類似,OpenACC定義了一套編譯器指令,這些指令應用于C、C++和Fortran代碼,以指導編譯器將指定的循環或代碼塊,從主機CPU轉移到相連的加速設備(例如GPU)上進行運算。
簡言之,OpenACC提供了一種簡潔的利用并行硬件的開發方式。目前,OpenACC已經在多種操作系統下實現,并支持NVIDIA、AMD和Intel的多種硬件計算設備[21]。未來,OpenACC可能會并入OpenMP標準,形成一個同時支持多核與眾核并行編程的統一標準。
C++accelerated massive parallelism(C++AMP)是一個由微軟倡導的開放標準,旨在直接利用C++語言實現數據的并行化編程[9]。
相比于常規的C++代碼,C++AMP只需要按規定格式對數據進行綁定,然后應用并行原語啟動數據操作(核函數)的運行。因此,C++AMP完全隱藏了硬件的細節。開發者只需要預先綁定數組和數組元素上的操作,并行化由C++AMP負責完成。C++AMP能夠根據實際的硬件情況(GPU或CPU,計算核心算數等),決定并行化策略。當實際硬件不支持并行化時,代碼還可以串行執行。
在OpenACC和C++AMP這2種異構編程模式下,硬件對開發者而言完全是透明的。一方面,這簡化了并行程序的開發——串行代碼只需要少量的改動,便可以利用GPU等多核計算設備的并行計算能力。但這種簡化并非沒有代價,它使得并行化的過程不能被程序員顯示地加以控制。而在很多情況下,根據硬件和程序的具體情況,對負載和并行粒度進行調整,對于充分利用計算設備能力、提高程序性能是至關重要的。
正如前文所述,CUDA和OpenCL是當前基于GPU的異構編程的主流平臺。它們的共同特點是,既對硬件的計算和存儲單元進行了很好的抽象,同時又對計算設備的計算核心數量這一重要參數,加以適度地暴露,并且對并行粒度和并行方式也給予了更大的控制可能。這樣便對完全隱藏硬件這一極端情況的進行了良好的折衷。同時,這2種平臺為GPU通用提供了從編程到調試再到性能測試的完整解決方案。
統一計算設備架構(compute unified device architecture,CUDA)是由 NVIDIA公司于 2006年 11月發布的基于NVIDIA GPU的并行程序開發架構[10]。它包括一個SDK(NVCC編譯器、調試器、函數庫等)、一套API,以及添加了少量擴展的C/C++語言(CUDA C/C++)。由它開發的程序能夠在所有支持CUDA的NVIDIA GPU上運行。CUDA的推出大大簡化了對GPU進行并行編程的難度。圖3示意了NVIDIA GPU的主要計算和存儲部件。接合圖3,對CUDA開發平臺的核心逐一進行簡要介紹。
CUDA允許使用C/C++為CUDA計算核心(CUDA Core,在較早的文檔中也稱了 Streaming Processor(SP),即流處理器)編寫程序——“核函數”(kernel)。
不同于常規的C/C++函數,當核函數被調用后,它會被N個不同的CUDA線程(thread)并行的執行N次。執行核函數的每個線程都被賦予一個一的線程索引ID。
如圖4所示,CUDA中的線程具有層次結構。一定數量線程組成線程塊(block);線程塊再組成更大的單位線程格(grid)。

圖4 線程的層級結構Fig.4 Hierarchy of threads
核函數啟動后,每個線程塊(thread block)被分配給某個流多處理器(streaming multiprocessor,SM)上執行。線程塊執行的先后順序是不確定的,它們必須相互獨立地被執行。即不論它們按何種次序,也不論是按并行還是串行方式,最后的執行結果都應該一致。
不同流多處理器上的線程是相互獨立的,相同流多處理器上的線程則是阻塞式的[10]。前者意味著,不同流多處理器上的線程由不同的處理器以任意先后順序執行;后者意味著,當一個活躍線程受到阻塞(如執行延遲較大的數據讀寫操作)時,流多處理器可以切換執行其他的線程,避免浪費寶貴的計算資源。
同基于CPU的常規計算機體系類似,GPU的存儲體系也具有層次性:容量大的存儲器,遠離GPU,讀寫也延遲大;延遲小的存儲單元容量小,位置靠近GPU。
如圖5,CUDA程序在運行過程中,線程能夠從不同的內存空間中讀取數據。每個線程都有僅本線程可見的局部內存(local memory)。局部空間一般是片上的寄存器,可以幾乎無延遲的讀寫。每個線程塊分配有一塊共享內存(shared memory),塊中的所有線程都可以讀寫共享內存的數據。共享內存靠近GPU,雖然不如寄存器讀寫速度快,但訪問延遲也非常小。離GPU最遠的是大容量的全局內存。所有線程都可以訪問全局內存,但讀寫延遲非常大,大約要比共享內存高出一個數量級。

圖5 線程的層級結構Fig.5 Hierarchy of threads
表1對比了在NVIDIA GeForce 560 Ti GPU中,不同層級內存的數據傳輸率。

表1 GPU 內存數據傳輸率(560 Ti,PCIe 2.0 x16)Table 1 GPU memory bandwidth(560 Ti,PCIe 2.0 x16)
除以上介紹的幾種存儲空間外,還存在2種對所有線程可見的只讀存儲空間——常量內存(constant memory)和紋理內存(texture memory)。常量內存和紋理內存的訪問延遲同全局內存相同,但前者配備有緩存(cache),在數據局部性較好時,訪問延遲要小于全局內存(參見圖6)。

圖6 NVIDIA GPU主要結構簡圖Fig.6 Diagram of NVIDIA GPU structure
同一線程塊內的線程可以通過共享內存(shared memory)(塊中每個都可以讀寫共享內存中的數據)和同步機制來相互協作。具體而言,程序員可以在核函數內調用內建函數來設置同步點,以使線程執行到該處后,停下來等待,直到同一塊中的所有線程均達到同步點。
除了提供以C/C++為基礎語言的高級編程平臺,CUDA SDK還提供了許多函數庫,高效實現常見操作,提高開發速度。例如,矩陣計算的cuBLAS和cuSPARSE,實施快速傅里葉變換的cuFFT,用于批量生成隨機數的cuRAND,以及用于加速人工神經網絡的 cuDNN[12-13]等。除了函數庫外,還有大量第三方開源或商業函數庫可供選擇。這些函數庫涵蓋基本代數運算、數值計算、統計、圖像處理、機器視覺、視頻編碼解碼、GIS等領域。這些函數的數量和范圍也在不斷的增加,最新進展可以參見文獻[11]。
調試和優化是編程開發重要的環節,也是GPU編程的一個難點。為簡化調試和優化流程,提高開發效率,CUDA提供了一系列軟件工具。
Parallel Nsight是集調試和性能測試于一體的編程輔助工具。Nsight可以集成在 Visual Studio(Windows下)和Eclipse(Linux下),實現交互式調試。在Linux環境下,開發者還可以在cuda-gdb在命令下進行調試,或將cuda-gdb同IDE配合使用。此外,CUDA SDK還提供了cuda-memcheck程序,檢查內存越界訪問錯誤。
除了上面提到的Nsight可以用于性能分析外,CUDA SDK還提供Visual Profiler工具,能夠以可視化的方式展示程序各部分的運行時間,方便尋找性能瓶頸,以便有針對性地進行優化。
開放計算語言(open computing language,OpenCL)是一個完全開放和免費的異構計算編程標準,它由非盈利性技術組織Khronos Group負責維護。OpenCL提供了一種跨平臺、硬件無關的并行計算解決方案。由它編寫的程序不僅能夠在多核CPU、APU及GPU上運行,還能運行在單核CPU甚至DSP和FPGA等硬件設備上。OpenCL獲得了主要硬件廠商Intel、AMD和NVIDIA的積極支持。
OpenCL的目標是提出一種跨硬件、跨平臺的異構編程框架標準。OpenCL規范主要由平臺模型、執行模型、內存模型和編程模型[13]4部分組成,它在硬件的抽象描述的基礎上,制定了異構的并行編程模式。在制定OpenCL標準時,Khronos Group大量借鑒了CUDA[14],因此,2種并行解決方案有很多相似之處,其中,大部分關鍵概念都可以一一對應。
OpenCL定義了具有多級結構的異構并行體系模型。如圖7所示,這一體系包括一個主機(host),多個設備(device);每個設備中包括若干計算單元(compute unit,CU)。計算單元對應于AMD GPU的計算單元(CU)或CUDA中的流多處理器(SM),但它也可以是CPU核心,還可以是DSP和FPGA等運算設備。計算單元又由若干處理單元(processing element,PE)組成。圖8給出了內存模型。

圖7 OpenCL設備模型Fig.7 OpenCL device model

圖8 OpenCL內存模型Fig.8 OpenCL memory model
如圖8所示,OpenCL規范還定義了內存的層級結構和可見性:遠離計算單元的全局內存(global memory)和常量內存(constant memory)是全局可見的,片上的局部內存(local memory)、計算單元內部的私有內存(private memory)則是局部可見的。
OpenCL定義了程序的執行模式。圖9給出了OpenCL抽象的數據并行模型。在OpenCL的概念中,執行單元也同是以層級結構進行組織的:工作項(work item)組成工作組(work group),工作組進而構成索引空間——NDRange。OpenCL的工作項,相當于CUDA的線程,是核函數執行的最小單元;工作組對應于CUDA的線程塊,工作組內的項有更加方便的數據共享和同步機制,便于彼此協作。工作組又被置于更大的索引空間NDRange中,它發揮著CUDA中線程格的作用,為工作組和工作項提供全局索引。

圖9 OpenCL并行執行模型Fig.9 OpenCL execution model
同CUDA一樣,工作項除了擁有在工作組內的坐標外,也具有工作組內的唯一的索引和唯一的全局索引;工作組也有著類似的索引結構。
OpenCL的核函數的基本結構同CUDA完全相同,只是在具體編寫時所使用的關鍵字不同。
OpenCL的核函數啟動后,每個工作項都會執行核函數中指令,這一點也與 CUDA相同。由于OpenCL是與具體硬件無關的,因此,核函數的啟動相對CUDA要復雜一些。(CUDA中,復雜的維護工作由運行時負責,用戶也可以通過Driver API來顯示的管理和查詢。由于CUDA是針對專用硬件平臺,因此,一般而言沒有這樣做的必要。)
如圖10,OpenCL首先需要創建一個上下文(context)來管理設備,不同類型的硬件對應不同類型的上下文。上下文對硬件設備進行了封裝,為主機調用設備的提供了統一的接口。主機啟動核函數后,核函數被放在一個命令隊列(CMD queue)中,等待執行。當設備完成一個核函數的執行后,會取出隊列中的第一個核函數繼續執行。關于OpenCL更詳細的說明,可以參考[13,15];關于基于 AMD GPU的編程開發,可以參見[16]。

圖10 OpenCL通過命令隊列和上下文管理核函數執行Fig.10 OpenCL manages the kernels through command queue and context
OpenCL的生態系統也提供了大量的函數庫,方便開發者利用。開源的數學函數庫clMath實現了快速傅里葉變換(FFT)和基礎線性代數全程庫(BLAS)。其中,FFT支持1~3維的實數和復數變換;BLAS支持全部 1~3級別的代數運算。在clMath的基礎上,MAGMA提供了矩陣的LU、QR和Chokesky分解、特征值計算等重要的矩陣操作的OpenCL實現。
目前已有許多優秀的工具,用于OpenCL程序的調試和優化。AMD APP SDK中的CodeXL包含了一整套軟件工具,幫助開發者最大限度地發掘GPU的計算潛力。CodeXL包括功能強大的調試器,能夠對CPU和GPU端的代碼進行細致的監測,同時還能對OpenCL的kernel函數進行表態分析。CodeXL可以配合Visual Studio使用,也可以單獨使用。
GPU通用計算已經進入高性能計算的主流行列,被用于流體模擬、物理仿真、圖像和信號處理、數值計算等諸多,并取得了良好的加速效果。文獻[1-2]和[17]給出了GPU在許多關鍵領域和問題上的重要應用。本節主要回顧GPU在計算智能領域的應用。
計算智能算法一般具備并行性的特點,因此,特別適用利用GPU平臺進行高效的并行化實現。
人工神經網絡(artificial neural network,ANN),模仿生物神經網絡的結構和功能,通過聯結大量的人工神經元進行計算。由于出色的特征學習能力,深度神經網絡已經在圖像識別、語言識別等領域取得了突破性進展。圖11展示了深層卷積神經網絡在學習圖像的低階和高階特征上表現出的良好性能[18]。

圖11 通過深度神經網絡學習到的低階和高階特征[27]Fig.11 Low level and high level features learned by DNN[27]
隨著深度學習[19](deep learning)研究的不斷深入,人工神經網絡的規模越來越大,計算復雜性不斷膨脹。通常,深度神經網絡包含上百萬甚至上億個自由參數,需要在海量的數據集上進行學習。因此,加速深度神經網絡的訓練速度是工程和科學領域的重要研究內容,直接關系到對深度神經網絡的研究以及其在實際中的應用。
超級計算機和大規模集群的成本高昂,個人和中小型研究機和企業構難于負擔。GPU通用計算,極大地降低了深度神經網絡的研究和應用的門檻。
2012,Krizhevsky等[20],搭建了一個深度神經網絡并用于圖像識別。這個神經網絡含有6 000萬個參數,650 000個神經元。這個神經網絡在ImageNet測試集(共有1 000個類別)上,取得了17%的Top 5分類錯誤率,取得了突破性的進展。而這個超大型神經網絡的訓練,正是得益于兩塊GPU的強大計算能力。
Stanford大學的研究人員提出了基于GPU陣列和分布式運算加速神經網絡的計算框架[21]。這個由16個GPU組成的GPU陣列,能夠訓練比1 000 CPU的Google集群大6.5倍規模的深度神經網絡。巨大的實用性使得基于GPU的人工神經網絡受到科研機構和IT企業的重視,是GPU能用計算研究熱點。
群體智能優化算法是一類基于群體的啟發式隨機優化算法,在工程和科學領域有著廣泛的應用。然而,群體算法優化過程中需要對目標函數進行大量的評估,這也極大的限制了群體算法在某些問題中的應用。群體算法的內在并行性,使得它們可以很好地利用GPU多核心、高度并行的特性。
Zhou等[22]最早利用GPU進行PSO算法的加速工作,在當時的硬件條件下,取得了8X倍的加速比。隨后,基于GPU的PSO變種及多目標群體算也相繼被提出[23-24]。
作為典型的基于GPU的群體智能優化方法實現,Ding等[25]提出了基于GPU并行加速的煙花算法(GPU-FWA)[26]。圖 12 示意了煙花算法基于GPU實現的基本流程。

圖12 基于GPU的煙花算法實現示意圖Fig.12 Diagram of GPU-FWA
GPU-FWA充分利用了GPU內存層級結構,主要數據通訊被限制在共享內存之間,從而減少了數據傳輸開銷。同時,GPU-FWA通過一種改進后的交互機制,進一步提高了運行速度。在對經典基準測試函數上的測試表明,GPU-FWA相對于傳統基于CPU的煙花算法,加速近200倍。
群體智能優化方法也在大量實際問題獲得良好應用。Rymut等[27]實現的GPU版本的基于PSO的體追蹤算法提速20~40倍。Mussi等[28]實現的基于異步PSO的人體追蹤算法,將原程序由CPU端的幾分鐘,提升到了幾秒鐘內完成,實現了跟蹤的實時性,提高的算法的實用性。Nobile等[29]將GPU多種群PSO應用于生物系統的參數估計,運行時間從6 h縮減到14 min,大大加快了參數選擇過程。利用GPU加速群體算法,不僅提高了原有應用的速度,而且也擴展了群體優化方法的應用范圍。新的基于GPU的群體算法的應用在不斷的出現,成研究的熱點。
首先,并非所有的計算任務都適合利用GPU進行計算。GPU適用于存在大量的數據并行性并且數據之間無復雜邏輯依賴的計算任務(典型的如矩陣計算)。對于存在復雜邏輯和隨機讀寫的應用場景,GPU可能并不是最佳的選擇。
其次,GPU對于算數運算的支持還有待提高。雖然現在主流GPU都支持符合IEEE標準的浮點運算,但在對雙精度浮點的支持上還有待提高。例如,經驗表明,對于同樣的網絡結構和訓練方法,使用單精度運算的出錯概率要明顯高于雙精度運算。同時,普通消費級別的GPU不支持ECC校驗,這一點在開發對運算可靠性要求較高的應用時需要特別注意。
同常規的并行編程一樣,GPU的高度并行性也使得程序的調試工作較為困難。雖然已有大量工具可以用來輔助調試,但對于邏輯錯誤等的調試依然是一項艱巨的挑戰。
另外,目前基于GPU開發的程序在可移植上還存在不足。CUDA由于其簡易性和相對完善的生態,在GPGPU領域處于絕對的領先地位,然而它僅僅支持NVIDIA的GPU?;陂_放標準的OpenCL的程序雖然具有移植性,但是移植性能情況取決于硬件平臺OpenCL驅動性能。目前,OpenCL的流行度正在不斷提升,軟硬件廠商對OpenCL支持力度也在不斷增大。在未來幾年,GPU編程的可移植性有望逐漸改善。
由于智能手機、平板電腦和可穿戴設備的普及,以及人們對于語音、視頻等多媒體資源需要的不斷高漲,GPU也在這是相對新興的領域得到廣泛應用。未來,GPU通用計算也很有可能在這些領域發揮重要影響,有望在這一領域帶來一場計算變革。而這些非傳統的計算設備往往具有低功耗和嵌入式的特點,這也給GPU計算帶來了新的挑戰[30,31]。
互聯網的日新月異,大數據的來勢洶洶,也為大規模服務器端計算帶來了巨大的挑戰。將GPU用于服務器將是應對挑戰的一種潛在的應對方案。由于GPU缺乏CPU的通用性和靈活性,選擇合適的組織方式便尤為重要。一種可能的方案是將GPU和CPU按照一定的比例組合(例如,一個計算結點配置若干數量的CPU和GPU)。目前,針對GPU陣列或分布式集群,已經有一些硬件連接解決方案和中間件支持。然而,這CPU和GPU之間的通信可能帶來潛在的性能瓶頸。混合架構是另一種可能的選擇方案。例如,AMD等硬件廠商提出HSA(heterogeneous system architecture)概念,試圖將 GPU和CPU在物理架構上進行深度整合,通過共享物理內存方式減小通信開銷。由于基于HAS這一新型體系結構的硬件還未大規模面世,因此其性能還有待在理論和實踐中進一步檢驗。
在計算領域,已經從多核時代跨向眾核時代,具有眾核架構的GPU已經進入高性能計算的主流行列。目前,GPU通用編程的軟硬件平臺已經相對成熟,成為了計算領域的重要力量。GPU能以相對低廉的價格提供巨大的計算能力,從而獲得了廣泛的應用。GPU通用計算的普及,使個人和小型機構能有機會獲得以往昂貴的大型、超級計算機才能提供的計算能力。可以說,GPU在一定程度上改變了計算領域的格局和編程開發模式。
GPU高度并行的特點使得GPU能夠高效地實現計算智能算法,以應對大規模復雜問題,并且已經在人工神經網絡和群體智能優化算法等方面獲得了大量的成功應用。GPU已經成為深度學習領域中事實上的標準計算平臺,在圖像、語音自然語言處理等領域發揮著不可替代的作用?;诙郍PU和GPU集群的深度網絡實現與訓練,也是深度學習領域的研究熱點。群體智能優化方法以其內在并行性,在GPU平臺獲得了良好的加速效果,從而擴大了群體算法求解問題的規模和范圍。隨著多目標優化應用和研究的日益廣泛,基于GPU的多目標群體智能優化方法將逐步流行,以更好地應對大規模復雜優化問題。
總之,作為通用計算單元,GPU將以更加多樣化的形式活躍在智能計算及其他計算領域。
[1]OWENS J D,LUEBKE D,GOVINDARAJU N,et al.A survey of general-purpose computation on graphics hardware[J].Computer Graphics Forum,2007,26(1):80-113.
[2]OWENS J D,LUEBKE D,GOVINDARAJU N,et al.GPU computing[J].Proceedings of the IEEE,2008,96(5):879-899.
[3]SUTTER H.The free lunch is over:a fundamental turn toward concurrency in software[J].Dr.Dobb’s Journal,2005,30(3):202-210.
[4]ROSS P E.Why CPU frequency stalled[J].Spectrum,2008,45(4):72-78.
[5]BORKAR S.Getting gigascale chips:challenges and opportunities in continuing Moore's Law[J].Queue,2003,1(7):26-33.
[6]NVIDIA.CUDA C programming guide v6.5[R].Santa Clara,CA,USA:NVIDIA Corporation,2014.
[7]JARARWEH Y,JARRAH M,BOUSSELHAM A,et al.GPU-based personal supercomputing[C]//2013 IEEE Jordan Conference on Applied Electrical Engineering and Computing Technologies.Amman,2013:1-5.
[8]KAPASI U J,RIXNER S,DALLY W J,et al.Programmable stream processors[J].Computer,2003,36(8):54-62.
[9]BUCK I,FOLEY T,HORN D,et al.Brook for GPUs:stream computing on graphics hardware[J].ACM Transactions on Graphics,2004,23(3):777-786.
[10]Microsoft.C++accelerated massive parallelism[Z].Redmond,WA,USA:Microsoft,2013.
[11]NVIDIA.CUDA C best practices guide version 4.1[R].Santa Clara,CA,USA:NVIDIA Corporation,2012.
[12]NVIDIA.GPU-Accelerated Libraries[OL/EB].[2015-01-05].https://developer.nvidia.com/gpu-accelerated-libraries.
[13]JIA Y,SHELHAMER E,DONAHUE J,et al.Caffe:convolutional architecture for fast feature embedding[C]//Proceedings of the ACM International Conference on Multimedia,[s.l.],2014:675-678.
[14]GASTER B,HOWES L,KAELI D R,等.OpenCL異構計算[M].北京:清華大學出版社,2012:10-35.
[15]KIRK D B,HWU W W.Programming massively parallel processors:a Hands-on approach[M].Beijing:Tsinghua University Press,2010:205-220.
[16]MUNSHI A,GASTER B,MATTSON T G,et al.OpenCL Programming Guide[M].Boston:Addison_Wesley Professional,2011:63-68.
[17]AMD上海研發中心.跨平臺的多核與從核編程講義——OpenCL 的方式[M].上海:AMD,2010:1-154.
[18]FARBER R.高性能CUDA應用設計與開發[M].北京:機械工業出版社,2013:1-49.
[19]ZEILER M,FERGUS R.Visualizing and understanding convolutional networks[C]//Proceedings of the 13th European Conference on Computer Vision.Zurich,Switzerland,2014:818-833.
[20]HINTON G,OSINDERO S,WELLING M,et al.Unsupervised discovery of nonlinear structure using contrastive backpropagation[J].Nature,2006,30(4):725-731.
[21]KRIZHEVSKY A,SUTSKEVER I,HINTON G.Imagenet classification with deep convolutionalneuralnetworks[C]//Advances in Neural Information Processing Systems 25.Reno,Nevada,USA,2012:1106-1114.
[22]COATES A,HUVAL B,WANG T,et al.Deep learning with COTS HPC systems[C]//Proceedings of the 30th International Conference on Machine Learning.Atlanta,USA,2013:1337-1345.
[23]ZHOU Y,TAN Y.GPU-based parallel particle swarm optimization[C]//IEEE Congress on Evolutionary Computation.Trondheim,Norway,2009:1493-1500.
[24]ZHOU Y,TAN Y.Particle swarm optimization with triggered mutation and its implementation based on GPU[C]//GECCO'10:Proceedings of the 12th Annual Conference on Genetic and Evolutionary Computation.Portland,Oregon,USA,2010:1-8.
[25]ZHOU Y,TAN Y.GPU-based parallel multi-objective particle swarm optimization[J].International Journal of Artificial Intelligence,2011,7(A11):125-141.
[26]DING K,TAN Y.A GPU-based parallel fireworks algorithm for optimization[C]//GECCO'13:Proceedings of the Fifteenth Annual Conference on Genetic and Evolutionary Computation Conference.Amsterdam,the Netherlands,2013:9-16.
[27]TAN Y,ZHU Y.Fireworks algorithm for optimization[C]//First International Conference of Swarm Intelligence.Beijing,China,2010:355-364.
[28]RYMUT B,KWOLEK B.GPU-supported object tracking using adaptive appearance models and particle swarm optimization[C]//International Conference on Computer Vi-sion and Graphics,Warsaw,Poland,2010:227-234.
[29]MUSSI L,IVEKOVIC S,CAGNONI S.Markerless articulated human body tracking from multi-view video with GPU-PSO[C]//9th International Conference on Environmental Systems.York,UK,2010:97-108.
[30]NOBILE M S,BESOZZI D,CAZZANIGA P,et al.A GPU-based multi-swarm PSO method for parameter estimation in stochastic biological systems exploiting discretetime target series[C]//10th European Conference on Evolutionary Computation,Machine Learning and Data Mining in Computational Biology.Málaga,Spain,2012,7246:74-85.
[31]MAGHAZEH A,BORDOLOI UD,ELES P,et al.General purpose computing on low-power embedded GPUs:has it come of age[R].Link?ping University Electronic Press,2013.
[32]HALLMANS D,SANDSTROM K,LINDGREN M,et al.GPGPU for industrial control systems[C]//2013 IEEE 18th Conference on Emerging Technologies Factory Automation.Cagliari,Italy,2013:1-4.