多CPU程序開發: OpenMP-MPI(機羣)和CUDA(GPU)

CPU和GPU擅長和不擅長的方面

從它們執行運算的速度與效率的方面來探討這個論題。
CPU和GPU都是具備運算能力的芯片,CPU更像「通才」——指令運算(執行)爲重+ 數值運算,GPU更像「專才」——圖形類數值計算爲核心。在不一樣類型的運算方面的速度也就決定了它們的能力——「擅長和不擅長」。芯片的速度主要取決於三個方面:微架構,主頻和IPC(每一個時鐘週期執行的指令數)。
1.微架構
從微架構上看,CPU和GPU看起來徹底不是按照相同的設計思路設計的,當代CPU的微架構是按照兼顧「指令並行執行」和「數據並行運算」的思路而設計,就是要兼顧程序執行和數據運算的並行性、通用性以及它們的平衡性。CPU的微架構偏重於程序執行的效率,不會一味追求某種運算極致速度而犧牲程序執行的效率。
CPU微架構的設計是面向指令執行高效率而設計的,於是CPU是計算機中設計最複雜的芯片。和GPU相比,CPU核心的重複設計部分很少,這種複雜性不能僅以晶體管的多寡來衡量,這種複雜性來自於實現:如程序分支預測,推測執行,多重嵌套分支執行,並行執行時候的指令相關性和數據相關性,多核協同處理時候的數據一致性等等複雜邏輯。
GPU實際上是由硬件實現的一組圖形函數的集合,這些函數主要用於繪製各類圖形所須要的運算。這些和像素,光影處理,3D 座標變換等相關的運算由GPU硬件加速來實現。圖形運算的特色是大量同類型數據的密集運算——如圖形數據的矩陣運算,GPU的微架構就是面向適合於矩陣類型的數值計算而設計的,大量重複設計的計算單元,這類計算能夠分紅衆多獨立的數值計算——大量數值運算的線程,並且數據之間沒有像程序執行的那種邏輯關聯性。
GPU微架構複雜度不高,儘管晶體管的數量很多。從應用的角度看,如何運用好GPU的並行計算能力主要的工做是開發好它的驅動程序。GPU驅動程序的優劣很大程度左右了GPU實際性能的發揮。
所以從微架構上看,CPU擅長的是像操做系統、系統軟件和通用應用程序這類擁有複雜指令調度、循環、分支、邏輯判斷以及執行等的程序任務。它的並行優點是程序執行層面的,程序邏輯的複雜度也限定了程序執行的指令並行性,上百個並行程序執行的線程基本看不到。GPU擅長的是圖形類的或者是非圖形類的高度並行數值計算,GPU能夠容納上千個沒有邏輯關係的數值計算線程,它的優點是無邏輯關係數據的並行計算。
2.主頻
另外,GPU執行每一個數值計算的速度並無比CPU快,從目前主流CPU和GPU的主頻就能夠看出了,CPU的主頻都超過了1GHz,2GHz,甚至3GHz,而GPU的主頻最高還不到1GHz,主流的也就500~600MHz。要知道1GHz = 1000MHz。因此GPU在執行少許線程的數值計算時並不能超過CPU。
目前GPU數值計算的優點主要是浮點運算,它執行浮點運算快是靠大量並行,可是這種數值運算的並行性在面對程序的邏輯執行時毫無用處。
3.IPC(每一個時鐘週期執行的指令數)
這個方面,CPU和GPU沒法比較,由於GPU大多數指令都是面向數值計算的,少許的控制指令也沒法被操做系統和軟件直接使用。若是比較數據指令的IPC,GPU顯然要高過CPU,由於並行的緣由。可是,若是比較控制指令的IPC,天然是CPU的要高的多。緣由很簡單,CPU着重的是指令執行的並行性。
另外,目前有些GPU也可以支持比較複雜的控制指令,好比條件轉移、分支、循環和子程序調用等,可是GPU程序控制這方面的增長,和支持操做系統所須要的能力CPU相比仍是天壤之別,並且指令執行的效率也沒法和CPU相提並論。
最後總結一下:
CPU擅長的:操做系統,系統軟件,應用程序,通用計算,系統控制等等;遊戲中人工智能,物理模擬等等;3D建模-光線追蹤渲染;虛擬化技術——抽象硬件,同時運行多個操做系統或者一個操做系統的多個副本等等。
GPU擅長的:圖形類矩陣運算,非圖形類並行數值計算,高端3D遊戲。
綜上所述,在一臺均衡計算的計算機系統中,CPU和GPU仍是各司其職,除了圖形運算,GPU未來可能主要集中在高效率低成本的高性能並行數值計算,幫助CPU分擔這種類型的計算,提升系統這方面的性能。而當前的典型應用仍是高端3D遊戲,一個高效的GPU配合一個高效的CPU,3D遊戲的總體效率才能獲得保證。「高端3D遊戲只須要高端顯卡」或者「高端3D遊戲只須要CPU」都是無稽之談。

OpenMP

OpenMP是由OpenMP Architecture Review Board牽頭提出的,並已被普遍接受的,用於共享內存並行系統的多線程程序設計的一套指導性註釋(Compiler Directive)。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 這樣的理想化。除此以外,也不是全部工做都是能夠切割的!不少工做是有關聯性的,這樣若是直接切割給不一樣的處理核心各自去平行運算,出來的結果是確定有問題的。並且,多執行緒的程式在編寫、維護上,也都比單一執行緒的程式複雜上很多。

  不過,若是電腦自己是多處理器、多核心處理器,或是處理器擁有像 Intel Hyper-Threading Technology
這類的能在同一個時間處理多個執行緒的功能的話,那把各自獨立的工做由單一執行緒改爲多執行緒,在執行的效率上,大多仍是會有增進的!

多執行緒的程式

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

  可是,實際上要去控制 thread 是滿麻煩的~在程式的編寫上,也會複雜很多;而若是咱們只是想要把一些簡單的迴圈平行化處理,用 thread library 來控制,實在有點殺雞用牛刀的感受。這時候,用 Open MP 就簡單多了!OpenMP 是一種能透太高階指令,很簡單地將程式平行化、多執行緒化的
API;在最簡單的情形,甚至能夠只加一行指令,就能夠將回圈內的程式平行化處理了!

OpenMP 的基本使用

  要在Visual
C++
2005 中使用OpenMP其實不難,只要將 Project 的Properties中C/C++裏Language的OpenMP Support開啓(參數爲 /openmp),就可讓VC++2005 在編譯時支持OpenMP 的語法了;而在編寫使用OpenMP
的程序時,則須要先include OpenMP的頭文件:omp.h。

  而要將 for 迴圈平行化處理,該怎麼作呢?很是簡單,只要在前面加上一行

  #pragma omp parallel for

  就夠了!

  也能夠實際用一段簡單的程序,來弄清楚它的運做方式。

#include <STDIO.H>

  #include <STDLIB.H>

  void Test(int n) {

  for (int i = 0; i < 10000; ++i)

  {

  //do nothing, just waste time

  }

  printf("%d, ", n);

  }

  int main(int argc, char* argv[])

  {

  for (int i = 0; i < 10; ++i)

  Test(i);

  system("pause");

  }

  上面的程序,在 main() 是一個很簡單的迴圈,跑十次,每次都會調用Test()這個函數,並把是迴圈的執行次數(i)傳進Test() 並打印出來。想固然,它的結果會是:

  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

  而若是想利用 OpenMP把 main() 裏面的迴圈平行化處理呢?只須要修改爲下面的樣子:

#include <omp.h>

  #include <stdio.h>

  #include <stdlib.h>

  void Test (int n) {

  for (int i = 0; i < 10000; ++i) {

  //do nothing, just waste time

  }

  printf("%d, ", n);

  }

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

#pragma omp parallel for

for (int i = 0; i < 10; ++i)

  Test( i );

  system("pause");

  }

  夠簡單吧?重頭到尾,只加了兩行!而執行後,能夠發現結果也變了!

  0, 5, 1, 6, 2, 7, 3, 8, 4, 9,

  能夠從結果很明顯的發現,他沒有照着0到9的順序跑了!而上面的順序怎麼來的?其實很簡單,OpenMP只是把迴圈 0 - 9 共十個步驟,拆成 0 - 4, 5 - 9 兩部份,丟給不一樣的執行緒去跑,因此數字纔會出現這樣交錯性的輸出~

而要怎麼肯定真的有跑多執行緒呢?若是原本有多處理器、多核心處理器或有 Hyper Thread 的話,一個單執行緒程序,最多隻會把一顆核心的使用量吃完;像好比說在 Pentium 4 HT 上跑,單一執行緒的程序,在工做管理員中看到的 CPU 使用率最多就是
50%。而利用 OpenMP 把迴圈進行平行化處理後,就能夠在執行迴圈時,把兩顆核心的 CPU 都榨光了!也就是CPU 使用率是100%。

http://txl716.blog.163.com/blog/static/19353158200841792312627/

http://www.txrjy.com/baike/view.asp?OpenMP

MPI

1.Message
Passing Interface

三個英文單詞首字母的簡稱。具備表明性的有Message Passing Interface ,Multi Point Interface ,Multi points injection等。 html

  對MPI的定義是多種多樣的,但不外乎下面三個方面,它們限定了MPI的內涵和外延:   一、MPI是一個庫,而不是一門語言。許多人認爲,MPI就是一種並行語言,這是不許確的。可是,按照並行語言的分類,能夠把FORTRAN+MPI或C+MPI看做是一種在原來串行語言基礎之上擴展後獲得的,並行語言MPI庫能夠被FORTRAN77/C/Fortran90/C++調用,從語法上說,它遵照全部對庫函數/過程的調用規則,和通常的函數/過程沒有什麼區別;   二、MPI是一種標準或規範的表明,而不特指某一個對它的具體實現,迄今爲止,全部的並行計算機制造商都提供對MPI的支持,能夠在網上免費獲得MPI在不一樣並行計算機上的實現,一個正確的MPI程序能夠不加修改地在全部的並行機上運行;   三、MPI是一種消息傳遞編程模型,併成爲這種編程模型的表明。事實上,標準MPI雖然很龐大,可是它的最終目的是服務於進程間通訊這一目標的;   解釋來源於《高性能計算之並行編程技術——
MPI並行程序設計》都志輝 編著 linux

四、MPI是多點接口(Multi Point Interface)的簡稱,是西門子公司開發的用於PLC之間通信的保密的協議。MPI通信是當通訊速率要求不高、通訊數據量不大時,能夠採用的一種簡單經濟的通信方式。MPI通訊可以使用PLC S7-200/300/400、操做面板TP/OP及上位機MPI/PROFIBUS通訊卡,如CP5512/CP5611/CP5613等進行數據交換。MPI網絡的通訊速率爲19.2Kbps~12Mbps,最多能夠鏈接32個節點,最大通信距離爲50m,可是可能經過中斷器來擴展長度。
解釋來源於《西門子工業網絡通訊指南》(上冊) 崔堅 主編 程序員

MPI(Message Passing Interface)是消息傳遞並行程序設計的標準之一,當前通用的是MPI1.1規範。正在制定的MPI2.0規範除支持消息傳遞外,還支持MPI的I/O規範和進程管理規範。MPI正成爲並行程序設計事實上的工業標準。
  MPI的實現包括MPICH、LAM、IBM MPL等多個版本,最經常使用和穩定的是MPICH,曙光天潮系列的MPI以MPICH爲基礎進行了定製和優化。 算法

  MPICH含三層結構,最上層是MPI的API,基本是點到點通訊,和在點到點通訊基礎上構造的集羣通訊(Collective Communication);中間層是ADI層(Abstract
Device Interface),其中device能夠簡單地理解爲某一種底層通訊庫,ADI就是對各類不一樣的底層通訊庫的不一樣接口的統一標準;底層是具體的底層通訊庫,例如工做站機羣上的p4通訊庫、曙光1000上的NX庫、曙光3000上的BCL通訊庫等。 數據庫

  MPICH的1.0.12版本如下都採用第一代ADI接口的實現方法,利用底層device提供的通訊原語和有關服務函數實現全部的ADI接口,能夠直接實現,也能夠依靠必定的模板間接實現。自1.0.13版本開始,MPICH採用第二代ADI接口。 編程

  咱們將MPICH移植到曙光3000高效通訊庫BCL(Basic Communication Library)上(簡稱MPI_BCL)。MPI_BCL的接口標準與MPICH版本1.1徹底一致,知足MPI1.1標準。同時,也支持ch_p4的通訊庫,即利用TCP/IP通訊機制。從網絡硬件角度說,MPI_BCL針對系統網絡,MPI_ch_p4針對高速以太網數組

書名: MPI並行程序設計實例教程

  做 者:張武生李建江 出版社清華大學出版社   出版時間:
2009 ISBN:
9787302186472   開本: 16   訂價:
39.50 元 緩存

內容簡介

  《MPI並行程序設計實例教程》旨在經過示例全面介紹MP1並行程序開發庫的使用方法、程序設計技巧等方面的內容,力爭完整討論MP1規範所定義的各類特徵。主要也括MPI環境下開發並行程序經常使用的方法、模式、技巧等內容。在內容組織上力求全面綜合地反映MPl-1和MPI-2規範。對MPI所定義的各類功能、特徵分別給出可驗證和測試其工做細節的示例程序 安全

編輯推薦

  ◆書中內容側重於以MPI庫爲基礎開發並行應用程序,對MP規範定義的各項功能和特徵在闡述其特色基礎上均配以實例加以說明和印證。   ◆書中所附實例儘可能採用獨立的功能劃分,其中的代碼片斷可直接用於並行應用程序開發   ◆在講述基本原理的同時,注重對各項消息傳遞和管理操做的功能及侷限性、適用性進行分析從而使熟讀此書的讀者可以編寫出適合應用特色,易維護、高效率的並行程序。   ◆與《MPI並行程序設計實例教程》配套的電子教案可在清華大學出版社網站下載。 服務器

目錄

  第1章MPI並行環境及編程模型   1.1MPICH2環境及安裝和測試   1.1.1編譯及安裝   1.1.2配置及驗汪   1.1.3應用程序的編譯、連接   1.1.4運行及調試   1.1.5MPD中的安全問題   1.2MPI環境編程模型   1.2.1並行系統介紹   1.2.2並行編程模式   1.2.3MPI程序工做模式   1.3MPI消息傳遞通訊的基本概念   1.3.1消息   1.3.2緩衝區   1.3.3通訊子   1.3.4進樣號和l進程紕   1.3.5通價脅議   1.3.6隱形對象   第2章點到點通訊   2.1阻餈通訊   2.1.1標準通訊模式   2.1.2緩衝通訊模式   2.1.3就緒通訊模式   2.1.4同步通訊模式   2.1.5小結   2.2非阻塞通訊   2.2.1通訊結束測試   2.2.2非重複的非阻塞通訊   2.2.3可醺復的非阻塞通訊   2.2.4Probe和Cancel   2.3組合發送接收   2.3.1MPl_Send,MPI_RecvoMPl_Sendreev   2.3.2MPI_Bsend←→MPl_Sendrecv   2.3.3MPI_Rsend←→MPI_Sendrecv   2.3.4MPl_Ssend←→MPl_Sendrecv   2.3.5MPl_lsend←→MP1一Sendrecv   2.3.6MPl_Ibsend←→MPI_Sendrecv   2.3.7MPI_Irsend←→MPI_Sendrecv   2.3.8MPl_Issend,MPI_Irecv←→MPI_Sendrecv   2.3.9MPISend_init←→MPl_Sendrecv   2.3.10MPI一Bsendjinit←→MPl_Sendrecv   2.3.11MPI_Rsend_init←→MPI_Sendrecv   2.3.12MPl_Ssend_init,MPl_Recv_init←→MPl_Sendrecv   2.4點到點通訊總結   2.4.1關於預防死鎖   2.4.2關於阻塞與非阻塞、同步與異步   2.4.3關於操做的執行順序及「公平性」   第3章組與通訊子   3.1簡介   3.2組管理API   3.2.1組的構建及取消   3.2.2訪問組的相關信息和屬性   3.3組問通訊   3.3.1建立與取消   3.3.2訪問通訊子信息   3.4組間通訊   3.4.1訪問函數   3.4.2構造和取消函數   3.5屬性   3.5.1建立及釋放屬性操做   3.5.2訪問屬性操做   3.5.3設置及刪除屬性操做   3.5.4命名通訊子對象   3.6錯誤處理   3.7組及通訊子的小結   第4章集合通訊   4.11←→N   4.1.1MPI_Bcast   4.1.2MPI_Scatter/MPI_Scatterv   4.2N←→1   4.2.1MPl_Gather/MPI_Gatherv  4.2.2MPI_Reduce   4.3N←→N   4.3.1MPI_Allgather/MPI_Allgatherv.   4.3.2MPI_Allreduce   4.3.3MPl_Reducescatter   4.3.4MPI_Alltoall/MPIAlltoallv/MPI_Alltoallw   4.3.5MPI_Scan/MPI_Exscan   4.4同步操做--MPI_Barrier   第5章數據類型   5.1類型圖   5.2與數據類型相關的API函數   5.2.1建立   5.2.2訪問   5.2.3註冊與取消   5.3數據類型在通訊函數緩衝區的構成   5.4數據類型的屬性   5.4.1屬性建立與釋放   5.4.2屬性操做   5.4.3複製數據類型   5.4.4類型屬性舉例   5.4.5數據類型命名   5.5數據類型的析構   5.5.1獲取建立數據類型MPI函數所使用參數數量信息   5.5.2獲取建立數據類型MPI函數所使用實際參數信息   5.5.3示例   5.6打包/解包   第6章進程拓撲   第7章動態進程管理   第8章單向通訊/遠端內存訪問   第9章並行I/O   第10章MPI與外部環境的信息交互   第11章MPE   參考文獻

MPI並行程序設計
http://wenku.baidu.com/view/3d1a6df80242a8956bece43c.html

CUDA

CUDA(Compute Unified Device Architecture),顯卡廠商NVidia推出的運算平臺。 CUDA™是一種由NVIDIA推出的通用並行計算架構,該架構使GPU可以解決複雜的計算問題。它包含了CUDA指令集架構(ISA)以及GPU內部的並行計算引擎。開發人員如今能夠使用C語言來爲CUDA™架構編寫程序,C語言是應用最普遍的一種高級編程語言。所編寫出的程序因而就能夠在支持CUDA™的處理器上以超高性能運行。未來還會支持其它語言,包括FORTRAN以及C++。

簡介  計算行業正在從只使用CPU的「中央處理」向CPU與GPU並用的「協同處理」發展。爲打造這一全新的計算典範,NVIDIA&reg;(英偉達™)發明了CUDA(Compute
Unified Device Architecturem,統一計算設備架構)這一編程模型,是想在應用程序中充分利用CPU和GPU各自的優勢。如今,該架構現已應用於GeForce&reg;(精視™)、ION™(翼揚™)、Quadro以及Tesla GPU(圖形處理器)上,對應用程序開發人員來講,這是一個巨大的市場。

  在消費級市場上,幾乎每一款重要的消費級視頻應用程序都已經使用CUDA加速或很快將會利用CUDA來加速,其中不乏Elemental Technologies公司、MotionDSP公司以及LoiLo公司的產品。

  在科研界,CUDA一直受到熱捧。例如,CUDA現已可以對AMBER進行加速。AMBER是一款分子動力學模擬程序,全世界在學術界與製藥企業中有超過60,000名研究人員使用該程序來加速新葯的探索工做。

  在金融市場,Numerix以及CompatibL針對一款全新的對手風險應用程序發佈了CUDA支持並取得了18倍速度提高。Numerix爲近400家金融機構所普遍使用。

  CUDA的普遍應用造就了GPU計算專用Tesla GPU的崛起。全球財富五百強企業如今已經安裝了700多個GPU集羣,這些企業涉及各個領域,例如能源領域的斯倫貝謝與雪佛龍以及銀行業的法國巴黎銀行

  隨着微軟Windows
7與蘋果Snow Leopard操做系統的問世,GPU計算必將成爲主流。在這些全新的操做系統中,GPU將不只僅是圖形處理器,它還將成爲全部應用程序都可使用的通用並行處理器。

發展歷程

  隨着顯卡的發展,GPU愈來愈強大,並且GPU爲顯示圖像作了優化。在計算上已經超越了通用的CPU。如此強大的芯片若是隻是做爲顯卡就太浪費了,所以NVidia推出CUDA,讓顯卡能夠用於圖像計算之外的目的。

  目前只有G80、G9二、G9四、G9六、GT200、GF100平臺(即Geforce 8~Gecorce GTX480)的NVidia顯卡才能使用CUDA,工具集的核心是一個C語言編譯器。G80中擁有128個單獨的ALU,所以很是適合並行計算,並且數值計算的速度遠遠優於CPU。

  CUDA的SDK中的編譯器和開發平臺支持Windows、Linux系統,能夠與Visual Studio2005集成在一塊兒。

  Geforce8CUDA(Compute Unified Device Architecture)是一個新的基礎架構,這個架構能夠使用GPU來解決商業、工業以及科學方面的複雜計算問題。它是一個完整的GPGPU解決方案,提供了硬件的直接訪問接口,而沒必要像傳統方式同樣必須依賴圖形API接口來實現GPU的訪問。在架構上採用了一種全新的計算體系結構來使用GPU提供的硬件資源,從而給大規模的數據計算應用提供了一種比CPU更增強大的計算能力。CUDA採用C語言做爲編程語言提供大量的高性能計算指令開發能力,使開發者可以在GPU的強大計算能力的基礎上創建起一種效率更高的密集數據計算解決方案。

  從CUDA體系結構的組成來講,包含了三個部分:開發庫、運行期環境和驅動(表2)。

  開發庫是基於CUDA技術所提供的應用開發庫。目前CUDA的1.1版提供了兩個標準的數學運算庫——CUFFT(離散快速傅立葉變換)和CUBLAS(離散基本線性計算)的實現。這兩個數學運算庫所解決的是典型的大規模的並行計算問題,也是在密集數據計算中很是常見的計算類型。開發人員在開發庫的基礎上能夠快速、方便的創建起本身的計算應用。此外,開發人員也能夠在CUDA的技術基礎上實現出更多的開發庫。

  運行期環境提供了應用開發接口和運行期組件,包括基本數據類型的定義和各種計算、類型轉換、內存管理、設備訪問和執行調度等函數。基於CUDA開發的程序代碼在實際執行中分爲兩種,一種是運行在CPU上的宿主代碼(Host
Code),一種是運行在GPU上的設備代碼(Device Code)。不一樣類型的代碼因爲其運行的物理位置不一樣,可以訪問到的資源不一樣,所以對應的運行期組件也分爲公共組件、宿主組件和設備組件三個部分,基本上囊括了全部在GPGPU開發中所須要的功能和可以使用到的資源接口,開發人員能夠經過運行期環境的編程接口實現各類類型的計算。

  因爲目前存在着多種GPU版本的NVidia顯卡,不一樣版本的GPU之間都有不一樣的差別,所以驅動部分基本上能夠理解爲是CUDA-enable的GPU的設備抽象層,提供硬件設備的抽象訪問接口。CUDA提供運行期環境也是經過這一層來實現各類功能的。目前基於CUDA開發的應用必須有NVIDIA CUDA-enable的硬件支持,NVidia公司GPU運算事業部總經理Andy
Keane在一次活動中表示:一個充滿生命力的技術平臺應該是開放的,CUDA將來也會向這個方向發展。因爲CUDA的體系結構中有硬件抽象層的存在,所以從此也有可能發展成爲一個通用的GPGPU標準接口,兼容不一樣廠商的GPU產品

CUDA™
工具包

  是一種針對支持CUDA功能的GPU(圖形處理器)的C語言開發環境。CUDA開發環境包括:

·
nvcc C語言編譯器

  · 適用於GPU(圖形處理器)的CUDA FFT和BLAS庫

·
分析器

  · 適用於GPU(圖形處理器)的gdb調試器(在2008年3月推出alpha版)

  · CUDA運行時(CUDA runtime)驅動程序(目前在標準的NVIDIA GPU驅動中也提供)

CUDA編程手冊

  CUDA開發者軟件開發包(SDK)提供了一些範例(附有源代碼),以幫助使用者開始CUDA編程。這些範例包括:

  · 並行雙調排序

  · 矩陣乘法

  · 矩陣轉置

  · 利用計時器進行性能評價

  · 並行大數組的前綴和(掃描)

  · 圖像卷積

  · 使用Haar小波的一維DWT

  · OpenGL和Direct3D圖形互操做示例

  · CUDA BLAS和FFT庫的使用示例

  · CPU-GPU C—和C++—代碼集成

  · 二項式期權訂價模型

  · Black-Scholes期權訂價模型

  · Monte-Carlo期權訂價模型

  · 並行Mersenne Twister(隨機數生成)

  · 並行直方圖

  · 圖像去噪

  · Sobel邊緣檢測濾波器

  · MathWorks MATLAB&reg;

  新的基於1.1版CUDA的SDK 範例如今也已經發布了。

技術功能

  · 在GPU(圖形處理器)上提供標準C編程語言

  · 爲在支持CUDA的NVIDIA GPU(圖形處理器)上進行並行計算而提供了統一的軟硬件解決方案

  · CUDA兼容的GPU(圖形處理器)包括不少:從低功耗的筆記本上用的GPU到高性能的,多GPU的系統。

  · 支持CUDA的GPU(圖形處理器)支持並行數據緩存和線程執行管理器

  · 標準FFT(快速傅立葉變換)和BLAS(基本線性代數子程序)數值程序庫

  · 針對計算的專用CUDA驅動

  · 通過優化的,從中央處理器(CPU)到支持CUDA的GPU(圖形處理器)的直接上傳、下載通道

  · CUDA驅動可與OpenGL和DirectX圖形驅動程序實現互操做

  · 支持Linux 32位/64位以及Windows XP 32位/64位 操做系統

  · 爲了研究以及開發語言的目的,CUDA提供對驅動程序的直接訪問,以及彙編語言級的訪問

其餘信息

  NVIDIA進軍高性能計算領域,推出了Tesla&CUDA高性能計算系列解決方案,CUDA技術,一種基於NVIDIA圖形處理器(GPU)上全新的並行計算體系架構,讓科學家、工程師和其餘專業技術人員可以解決之前沒法解決的問題,做爲一個專用高性能GPU計算解決方案,NVIDIA把超級計算可以帶給任何工做站或服務器,以及標準、基於CPU的服務器集羣

  CUDA是用於GPU計算的開發環境,它是一個全新的軟硬件架構,能夠將GPU視爲一個並行數據計算的設備,對所進行的計算進行分配和管理。在CUDA的架構中,這些計算再也不像過去所謂的GPGPU架構那樣必須將計算映射到圖形API(OpenGL和Direct 3D)中,所以對於開發者來講,CUDA的開發門檻大大下降了。CUDA的GPU編程語言基於標準的C語言,所以任何有C語言基礎的用戶都很容易地開發CUDA的應用程序。

  因爲GPU的特色是處理密集型數據和並行數據計算,所以CUDA很是適合須要大規模並行計算的領域。目前CUDA除了能夠用C語言開發,也已經提供FORTRAN的應用接口,將來能夠預計CUDA會支持C++、Java、Python等各種語言。可普遍的應用在圖形動畫、科學計算、地質、生物、物理模擬等領域。

  2008年NVIDIA推出CUDA SDK2.0版本,大幅提高了CUDA的使用範圍。使得CUDA技術愈發成熟

目前

  支持CUDA的GPU銷量已逾1億,數以千計的軟件開發人員正在使用免費的CUDA軟件開發工具來解決各類專業以及家用應用程序中的問題。這些應用程序從視頻與音頻處理和物理效果模擬到石油自然氣勘探、產品設計、醫學成像以及科學研究,涵蓋了各個領域。目前市面上已經部署了超過一億顆支持CUDA的GPU,數以千計的軟件開發人員正在使用免費的CUDA軟件工具來爲各類應用程序加速。

  CUDA 的核心有三個重要抽象概念: 線程組層次結構、共享存儲器、屏蔽同步( barrier

  synchronization),可輕鬆將其做爲C 語言的最小擴展級公開給程序員。

  CUDA 軟件堆棧由幾層組成,一個硬件驅動程序,一個應用程序編程接口(API)

  和它的Runtime,還有二個高級的通用數學庫,CUFFT 和CUBLAS。硬件被設計成支持輕

  量級的驅動和Runtime 層面,於是提升性能。

  所支持的OS(operating system)

  CUDA目前支持linux和Windows操做系統。進行CUDA開發須要依次安裝驅動、toolkit、SDK三個軟件。在安裝目錄/C/src目錄下有不少的例程能夠進行學習。

擴展閱讀:

NVIDIA CUDA技術亮點何在
  做爲圖形芯片領域的領頭羊, NVIDIA(英偉達)認爲GPU較CPU具備更強的浮點運算能力以及更大的帶寬等諸多優點,甚至連晶體管數量目前都是GPU略勝一籌,將來GPU將愈來愈多地取代CPU的數據處理職能。所以,英偉達在07年就提出了獨特的GPGPU(通用圖形處理器)概念。目前 NVIDIA(英偉達)新一代GPU都採用了統一渲染架構,這種架構相比以往使GPU的運算單元變得通用,並能夠根據圖形渲染處理的負載靈活地改變運算單元的任務。這種架構集成了多個支持頂點座標計算及三角形着色等多級處理的運算單元,各運算單元的任務能夠根據各級處理的負載進行調整。新架構的出現也使得在以浮點運算爲中心的通用處理中使用GPU成爲可能。

  在這種趨勢下, NVIDIA(英偉達)定製了一個解決方案,被稱做Compute Unified Device Architecture,簡稱CUDA。這也就是今天咱們介紹的主角!

  CUDA的編譯

  CUDA的本質是NVIDIA爲自家的GPU編寫了一套編譯器NVCC極其相關的庫文件。CUDA的應用程序擴展名能夠選擇是.cu,而不是.cpp等。NVCC是一個預處理器和編譯器的混合體。當遇到CUDA代碼的時候,自動編譯爲GPU執行的代碼,也就是生成調用CUDA Driver的代碼。若是碰到Host C++代碼,則調用平臺本身的C++編譯器進行編譯,好比Visual Studio C++本身的Microsoft C++ Compiler。而後調用Linker把編譯好的模塊組合在一塊兒,和CUDA庫與標準CC++庫連接成爲最終的CUDA
Application。因而可知,NVCC模仿了相似於GCC同樣的通用編譯器的工做原理(GCC編譯CC++代碼本質上就是調用cc和g++)。整個CUDA平臺是經過運用顯卡內的流處理器進行數學運算,並經過GPU內部的緩存共享數據,流處理器之間甚至能夠互相通訊,同時對數據的存儲也再也不約束於以GPU的紋理方式,存取更加靈活,能夠充分利用統一架構的流輸出(stream out)特性,大大提升應用效率。

CUDA技術特點

  CUDA的運算

  目前的CUDA所用的運算方法是分開的,一部分由CPU負責,而另外一部分經過CUDA編譯器使用GPU進行運算。在CUDA的架構下,一個程序分爲兩個部份:host 端和device 端。Host 端是指在CPU 上執行的部份,而device 端則是在顯示芯片上執行的部份。Device端的程序又稱爲 「kernel」。一般host端程序會將數據準備好後,複製到顯卡的內存中,再由顯示芯片執行device端程序,完成後再由host端程序將結果從顯卡的內存中取回。

因爲顯示芯片大量並行計算的特性,它處理一些問題的方式,和通常CPU是不一樣的。好比在內存存取latency 的問題上,CPU 一般使用cache 來減小存取主內存的次數,以免內存latency 影響到執行效率,而顯示芯片則多半沒有cache(或很小),而利用並行化執行的方式來隱藏內存的latency(即,當第一個 thread 須要等待內存讀取結果時,則開始執行第二個thread,依此類推),效率提升很多。正如 NVIDIA(英偉達)公司Tesla GPU計算事業部高級產品經理Sumit Gupta先生曾經推過一個形象的例子,CPU的順序指令執行操做比如是一間辦公室裏的多個職員,若是每人須要將杯子裏的水倒入同一個桶內時,他們須要排成長隊按順序進行。而對於GPU來講,這些職員無需排隊,只要同時走到桶前將水倒入便可。因此,最適合利用CUDA處理的問題,是能夠大量並行化的問題,纔能有效隱藏內存的latency,並有效利用顯示芯片上的大量執行單元。使用CUDA
時,同時有上千個thread在執行是很正常的。所以,若是不能大量並行化的問題,使用CUDA就沒辦法達到最好的效率了。

GPU並行計算過程

  CPU存取顯卡內存時只能透過PCI Express 接口,所以速度較慢(PCI Express x16 的理論帶寬是雙向各4GB/s),所以不能過多進行這類動做,以避免下降效率。在CUDA架構下,顯示芯片執行時的最小單位是thread。數個thread 能夠組成一個block。一個block 中的thread 能存取同一塊共享的內存,並且能夠快速進行同步的動做。每個block 所能包含的thread 數目是有限的,不過執行相同程序的block,能夠組成grid。不一樣block中的thread沒法存取同一個共享的內存,所以沒法直接互通或進行同步。所以,不一樣block中的thread能合做的程度是比較低的。不過,利用這個模式,可讓程序不用擔憂顯示芯片實際上能同時執行的thread數目限制。例如,一個具備不多量執行單元的顯示芯片,可能會把各個block中的thread順序執行,而非同時執行。不一樣的grid則能夠執行不一樣的程序。

在目前支持CUDA的GPU中,其流處理器個數是不能和CPU如今擁有的內核數量做類比的。CPU的每個核心都是一個完整的獨立處理架構,而GPU中的每一個流處理器並不徹底是這樣,而是以子組合方式運做,好比每8個流處理器組成一個Stream Multiprocessors (SM),其中分爲四個流處理器又分爲1小組,也能夠當作是有兩組4D的SIMD處理器。須要說明的是,若用戶擁有超過兩張或以上支持CUDA的顯卡,驅動程序將經過PCIe總線自動分配工做負載,進一步提高效能。

  固然CUDA也有其弱勢的地方,並非全部的事情CUDA都可以很好地解決,好比像操做系統這樣複雜的指令和紛繁的分支循環而又用不多的線程來處理,這顯然就不是CUDA的強項了。高度並行的計算是CUDA的技術特性之一。

  那些GPU支持CUDA?

  在推出GeForce GTX 200系列前,CUDA短短兩年時間就已經發展了四個版本:

不一樣CUDA版本對比

  目前,NVIDIA(英偉達)推出的GPU中,G80系列支持CUDA 1.0,而以後推出的G8四、G8六、G9二、G94和G96 則支持CUDA 1.1。

GeForce顯卡規格對比

CUDA 2.0—隨GeForce GTX 200登場

  而NVIDIA(英偉達)在6月17日GeForce GTX 200系列發佈之時也推出了CUDA 2.0,加入雙精度運算支持,爲應用提供更準確的運算結果,而這項技術源自於多重處理器的專用單元。

多重處理器的專用單元框架

  每個多重處理器都包含了8個主要的FMAD處理器和8和MUL處理器來實現一些特殊功能的計算等。這樣,一個64位的FMAD處理器就產生了。可是這樣的處理器對於64位的計算能力至關低下,8X的低速FMAD和16X的低速FMUL都是致使計算能力低下的緣由。這個支持64位也意味着能夠以它爲模板爲未來的更高級和新一代的GPU發展提供代碼或者應用程序的支持,從而獲得更好的甚至超過一個以上的64位處理器。每個多重處理器都具備兩個流處理線,這樣就沒必要依賴週期而同時處理兩個信號。

  引入雙精度運算能力,能夠在必定程度上加強GT200在科學計算領域的適用性.儘管在實際的相關領域中其實有部分甚至只須要16位精度就足夠了,但GTX200核心的每個SM都包括了一個雙精度64Bit浮點運算單元,因此每一個週期GT200能達成1MAD*30SM=30MAD,在1.5GHz的shader頻率下能夠達到90 GFLOPS(MAD)的雙精度浮點性能, NVIDIA(英偉達)對其稱之爲能夠與8核Xeon處理器(我想應該是指45nm Hypertown內核Xeon E5440 2.83GHz)的水平。不過須要注意的是,Xeon每一個內核的浮點單元組合是每兩個週期完成一個ADDPD或者一個週期完成一個MULPD,在雙精度浮點峯值性能上"含金量"方面彷佛要比GT200每一個SM單週期MAD高一些。
NVIDIA(英偉達)的對手AMD在RV670上實現了硬件(非模擬)的FP64支持,雙精度MAD性能爲單精度MAD的1/5,GT200架構的雙精度浮點支持應該是 NVIDIA(英偉達)邁向雙精度浮點加速器的第一步,將來的架構極可能會把浮點雙精度的性能作到單精度的1/2水平,這將是很是可觀的。

CUDA將成爲又一個標準API接口

選擇CUDA的理由

  目前CUDA已經應用在不少領域,包括在通用計算中的一些GPU加速,遊戲中的物理模擬等等,而在科學計算中,CUDA可發揮的功效就更大了。好比有限元的計算、神經元的研究計算、地質分析等等科學研究的領域;固然目前GPU計算的應用仍是處於一個早期的階段,大部分CUDA應用都是專業人員和相關的程序員在開發,隨着CUDA的普遍推行,之後會有實際的基於CUDA的程序,更多的程序員可以加入進來,而且開發一些能夠給你們平常應用帶來好處的程序,只要有支持CUDA的GPU就可以利用到GPU計算的好處。

提升多GPU編程與執行效率 CUDA 4.0初探

CUDA 4.0提升多GPU效率

  ● CUDA帶給GPU行業無限可能

  2007年能夠說是GPU發展史上翻天覆地的一年,在這一年微軟推出了DirectX 10 API標準,將傳統的Pixel Shader(頂點着色器)、Vertex Shader(像素着色器)和Geometry Shader(幾何着色器),三種硬件邏輯被整合爲一個全功能的統一着色器Shader。

  這種API發展思路背後是微軟和NVIDIA、AMD對於整個GPU發展歷程的思考與轉型。它標誌着微軟開始支持GPU走向更強的可編程性,也標誌着Intel等傳統CPU製造廠商在將來幾年將要面對GPU的強硬挑戰,愈來愈多的高性能計算機和超級計算機已經開始以GPU做爲其運算能力提高的重要配件。

提升多GPU編程和執行效率 CUDA 4.0初探
天河一號-A所採用的NVIDIA Tesla GPU

  2007年一樣是NVIDIA值得回憶的一年,NVIDIA公司在這一年正式推出了CUDA整套方案,它是一個完整的通用計算產品。CUDA是Compute Unified Device Architecture(統一計算架構)的簡稱,是創建在GPU基礎之上的通用計算開發平臺,它是一個全新的軟硬件架構,能夠將GPU視爲一個並行數據計算的設備,對所進行的計算進行分配和管理。

提升多GPU編程和執行效率 CUDA 4.0初探
NVIDIA提出的CUDA通用計算方案

  簡單分析可知,CUDA是一種以C語言爲基礎的平臺,主要是利用顯卡強大的浮點運算能力來完成以往須要CPU才能夠完成的任務。這種整套方案的提出意味着程序員不再用去鑽研繁雜的底層彙編程序,而是在C語言的基礎上稍加學習就能掌握CUDA並經過它來調用GPU強大的浮點運算能力。

提升多GPU編程和執行效率 CUDA 4.0初探
CUDA 4.0的3個顯著提高

  這一版本的CUDA大幅度下降了編程難度,同時提高了GPU的編程和執行效率。CUDA 4.0主要的功能可以在Fermi架構的最新GPU上被髮揮出來,同時它可讓G80、G9二、GT200架構的GPU也擁有編程方式上的飛躍。

GPU統一虛擬尋址

  ● GPU統一虛擬尋址

  在2011年2月28日,NVIDIA發佈了最新版本的CUDA工具包——CUDA 4.0。藉助該工具包,開發人員可以開發出在GPU上運行的並行應用程序。本次NVIDIA歷經兩年時間發佈了CUDA 4.0版本,這一版本爲咱們帶來了3個核心的編程與執行方式提高,它們分別是:

  一、統一的虛擬尋址;
  二、更直接的GPU間通訊;
  三、加強型C++模板庫。

  這3個關鍵性提高讓更多開發人員可以利用GPU計算,它們也成爲CUDA 4.0的核心提高之處。接下來咱們經過NVIDIA官方公佈的資料來簡單分析CUDA 4.0的不一樣之處。

提升多GPU編程和執行效率 CUDA 4.0初探
多個GPU及其顯存能夠被視爲一體

  首先提出的是「GPU統一虛擬尋址」概念,咱們第一次見到這一律念在Fermi架構發佈的報道中,Fermi架構帶領GPU全面走向高性能計算的重要表現就在於存儲體系的結構完善和GPU統一的虛擬尋址,結構部分中關村在線顯卡頻道以前進行了大量分析,細心的讀者確定收藏了咱們的技術分析類文章

  Fermi的發佈完全統一了GPU尋址空間,將不一樣的尋址簡化爲一種指令,這在之前的的GPU中是不敢想象的,內存地址取決於存儲位置:最低位是本地,而後是共享,剩下的是全局。這種統一尋址空間也是支持C++的必需前提。

  本次CUDA 4.0版本的發佈可讓多個GPU以及CPU統一調用GPU顯存以及CPU內存,並將處理器(CPU+GPU)和存儲器(內存+顯存)視爲統一總體。在最大顯存爲6GB的Tesla產品中,多CPU和多GPU融合以後能夠爲整個系統帶來大容量存儲設備而且進行統一尋址。

GPU通訊和C++模板庫

  ● GPU通訊和C++模板庫

  多GPU通訊在之前的CUDA版本中代價很大,只有專業的並行編程環境才能驅動多款GPU在同一系統內執行一個任務,而目前桌面級應用中,若是用戶的多塊顯卡同時存在於系統中,一個CUDA加速程序每每只能調用其中一個GPU核心。

淺析DirectX11技術帶給圖形業界的改變
從DirectX 10到DirectX 11的多線程變化

  雖然咱們看到GPU在圖形操做時能夠有SLI速力或者CF交火能力,也有DirectX 提出的多線程渲染技術,可是高並行度的GPU通用計算領域在PC桌面級應用中反倒不能實現多款GPU聯合加速。

提升多GPU編程和執行效率 CUDA 4.0初探

  舊版的GPU Direct 1.0主要用於應用程序在網絡間通訊,新版的GPU Direct 2.0則轉入節點內通訊,支持P2P內存訪問、傳輸和同步,代碼更少,編程效率更高。在此以前,同一節點內的不一樣GPU互相訪問,須要繞道系統內存並進行兩次拷貝。就不用理會系統內存了,不一樣GPU能夠直接進行傳輸,只須要一個統一的存儲體系協議NVIDIA就搞定了整個問題。

  說到GPU支持C++編程你們必定不會陌生,在Fermi架構發佈之時,C++模板庫模板庫就已經被NVIDIA不斷升級。Fermi是首款支持第二代PTX指令的GPU架構,咱們知道PTX 2.0使得GPU具有更強的可編程性、更精確和提供更高的性能。

提升多GPU編程和執行效率 CUDA 4.0初探
Thrust C++模板化算法與數據結構

  經過上圖可知,Thrust C++模板化算法與數據結構提供了強大的開源C++並行算法和數據結構。相似C++ STL標準模板庫;可在編譯時自動選擇最快的代碼路徑,在多核心CPU與GPU之間分配工做。

  C/C++語言中全部變量和函數都是經過指針才能肯定對象,這樣存在編譯時分離的尋址空間沒法肯定指針的位置而致使沒法支持C/C++語言。PTX 2.0最爲突出的地方在於它提供的統一尋址空間的意義,將GPU當成「共享地址空間」的並行計算機。大量的算法是基於共享地址空間平臺的,這樣可以顯著推進GPU並行計算的發展。

CUDA 4.0引領行業如何發展

  ● CUDA 4.0引領行業如何發展

  2011年2月28日,NVIDIA官方發佈了CUDA 4.0以及全新計算開發包的各項特性,而3月5日NVIDIA正式發佈了GPU通用計算開發包的CUDA 4.0 RC候選版,並提供給開發人員下載使用。

提升多GPU編程和執行效率 CUDA 4.0初探
NVIDIA對本身的定位發生變化

  從官方公佈的資料看來,NVIDIA的確是早有打算並雄心勃勃進入並行計算市場,目前NVIDIA擁有了從Tegra到Tesla的整套芯片產品線。而這條產品線從節能高效到高性能計算全面涵蓋,這的確是一家處於產業鏈上游的「超級」計算芯片公司。

  CUDA從發佈開始,到目前已經到了4.0版,從NVIDIA提出CUDA這個概念,已經有將近四年的時間,在最近一年時間CUDA發展迅速,主要是Fermi架構推出以後GPU可編程性急劇提高,GPU和CPU的差距已經愈來愈近,二者關係也愈來愈緊密。

提升多GPU編程和執行效率 CUDA 4.0初探
CUDA 4個版本發展歷程

  上圖描述了NVIDIA CUDA發佈以來,從1.0版本官方大力宣傳和愛好者嘗試,到2.0版專用領域開始應用CUDA進行編程開發,3.0版本已經引來整個行業的關注,大量軟件開始基於CUDA進行基於GPU的加速開發,到今天推出4.0版本繼續下降開發難度提高開發效率。

  除了上述敘述以外,咱們經過資料獲得CUDA 4.0架構版本還包含大量其它特性與功能,其中包括:

  一、MPI與CUDA應用程序相結合——當應用程序發出MPI收發調用指令時,例如OpenMPI等改編的MPI軟件可經過Infiniband與顯卡顯存自動收發數據。

  二、GPU多線程共享——多個CPU主線程可以在一顆GPU上共享運行環境,從而使多線程應用程序共享一顆GPU變得更加輕鬆。 

  三、單CPU線程共享多GPU——一個CPU主線程能夠訪問系統內的全部GPU。  開發人員可以垂手可得地協調多顆GPU上的工做負荷,知足應用程序中「halo」交換等任務的須要。

  四、全新的NPP圖像與計算機視覺庫——其中大量圖像變換操做讓開發人員可以快速開發出成像以及計算機視覺應用程序。

  五、全新、改良的功能
  Visual Profiler中的自動性能分析功能
  Cuda-gdb中的新特性以及新增了對MacOS的支持
  新增了對C++特性的支持,這些特性包括新建/刪除以及虛擬等功能
  全新的GPU二進制反彙編程序

提升多GPU編程和執行效率 CUDA 4.0初探
3大核心提高可否帶來CUDA 4.0飛躍式發展

  目前CUDA可以有效利用GPU強勁的處理能力和巨大的存儲器帶寬進行圖形渲染之外的計算,普遍應用於圖像處理、視頻傳播、信號處理、人工智能、模式識別、金融分析、數值計算、石油勘探、天文計算、流體力學、生物計算、分子動力學計算、數據庫管理、編碼加密等領域,並在這些領域中對CPU得到了一到兩個數量級的加速,取得了使人矚目的成績。

相關文章
相關標籤/搜索