最近有空看了不少平行化的技術和語言,寫此篇作為紀錄
平行化就硬體層面來說可分為CPU和GPU兩種平行化,CPU的平行化我們稱之為Multi-Thread,也就是我們所熟知的執行緒;而GPU的平行化運算統稱為GPGPU(General-purpose computing on graphics processing units),泛指在GPU上非rendering的計算。而GPU的thread與我們常見的CPU thread不太相同(可異質的thread,如GUI與背景計算),他必須是要「相同執行步驟」的thread(如矩陣運算),才能由GPU執行平行化,所以在撰寫的思考會比較沒有自由。
接下來則是我們常見的CPU與GPU平行化的framework
CPU:
- Pthread:本是UNIX的thread,目前有許多跨平台的版本,實做了複雜的thread介面與同步機制
- openMP:與compiler綁定的#pragma巨集語法,目前大多數的C/C++ compiler都有支援(VC2010),使用相當簡單迅速
- windows.h: 與pthread類似,但不跨平台
對初學者來說,我相當建議使用openMP來實作平行化,如果有寫過matlab的平行化「parfor」,openMP就是差不多的東西,並且也實作非常容易使用的同步機制如「critial」,優點是其巨集式的語法,並且可以在需要的時後跳過巨集語法變回single thread的程式(方便debug),具有撰寫快速、維護容易的特性,讓我們可以專注在平行邏輯,而不是在封裝thread function。缺點是要寫出複雜的同步邏輯如condition就比較無力。但是對於非real time導向的科學計算加速很有幫助,要處理伺服器的複雜同步機制還是得使用自定thread function的傳統thread(如pthread)。
GPU:
- Nvidia CUDA: 目前最完整的GPGPU framework,包括了許多類似STL的加速資料結構與矩陣計算函式,如果你想省時間學習開發,選CUDA
- ATI Stream: 他們跑去玩openCL了~
- Miscrsoft DirectCompute: 微軟基於DirectX的GPGPU framework,理所當然的windows ONLY
- openCL: 由許多廠商共同支援跨GPU的通用framework,理論上是可以支援所有顯卡的,不過由於跨平台的特性,所以語法更低階更難寫,並且發展緩慢,但是在未來會成為主流
所以結論就是CUDA(啥?),你甚至可以使用類似openMP的#pragma語法來實作GPU thread,叫做HMPP,其主要規格定義在openHMPP,但這軟體是要錢的…
Intel為什麼沒有參一腳呢? 按照我在研討會上聽到的資訊,他們認為GPU以運算時間做為效能依據不夠客觀,應以工耗比(Performance/Power)來競爭才夠客觀,畢竟現在顯示卡已經可以算是一個小型主機版架構了,所以他們認為CPU是很給力的(了不起我們再買NV嘛)~~~