信息時代的硬件芯片和存儲器價格以摩爾定律的形式下降,可是現在處理的數據量也越來越大。我們先以cocoa編程為例,然后再結合網格計算、云計算,綜合對最新的高性能計算技術作介紹。
使用 runloop
在cocoa編程如果用NSThread開線程
[NSThread detachNewThreadSelect: @selector(run) toTarget:self withObject:nil]
也可以用runLoop的方式來取代
[self performSelector:@selector(run) withObject:nil afterDelay:0.0]
在runLoop里面的run函數要有循環調用
相比而言使用runLoop的方法效率更高。
Grand Central Dispatch
GCD是一項由蘋果發展起來的技術,用多核處理器和其他多處理系統去優化應用對系統的支持。這是一個根據線程池模式的并行任務的實現。它首先發布在mac os x10.6上,也可以用在ios 4上。
GCD是一個替代諸如NSThread等技術的很高效和強大的技術。GCD完全可以處理諸如數據鎖定和資源泄漏等負責的異步編程問題。
在開始之前,需要理解是要提供給GCD隊列的是代碼塊,用于在系統或者用戶創建的的隊列上調度運行。
如下會返回一個用戶創建的隊列:
dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);
執行一個隊列
如下會異步執行傳入的代碼:
dispatch_async(myQueue, ^{ [self doSomething]; }); 其中,首先傳入之前創建的隊列,然后提供由隊列運行的代碼塊。
聲明并執行一個隊列
如果不需要保留要運行的隊列的引用,可以通過如下代碼實現之前的功能:
dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });
從隊列中在主線程運行代碼
有些操作無法在異步隊列運行,因此必須在主線程(每個應用都有一個)上運行。UI繪圖以及任何對NSNotificationCenter的調用必須在主線程長進行。
在另一個隊列中訪問主線程并運行代碼的示例如下:
dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });
注意,dispatch_suspend (以及dispatch_resume)在主線程上不起作用。
SETI@home
at Home,在家搜尋外星智慧(地外文明---也就是我們常說的“外星人”)),是一個通過互聯網利用家用個人計算機處理天文數據的分布式計算項目。該項目試圖通過分析阿雷西博射電望遠鏡采集的無線電信號,搜尋能夠證實外星智能生物存在的證據。該項目由美國加州大學伯克利分校的空間科學實驗室主辦。
網格 計算: Xgrid
Xgrid是一組Mac OS X應用套件,它使管理人員可以將本地和遠程計算機連接起來形成網格,從而使本地和遠程用戶可以隨時使用整個網格提供的計算資源。當用戶將一項工作(Job)提交給系統后,Xgrid將為每項工作創建多個任務(Task)并且將它們分配給網格上的多個節點去并行地執行。Xgrid產生的目的是為了解決復雜耗時的計算問題,諸如蒙特卡洛計算、3D渲染等。然而,Xgrid本身并不是一種計算方法,它是一種讓多臺計算機相互“交談”的網格結構。
Xgrid允許一個程序在不同的機器上并行運行,從而迅速得到運行結果。在Xgrid中包括三大軟件組件:用于啟動運算例程的客戶機(Client)、進行初始化計算的控制機(Controller)以及執行計算過程的代理機(Agent)。
GridEZ.framework
GridEZ 框架是目的是使得你的yingiyong整合Xgrid的服務更加容易。XgridFoudation api是強大的,可是它使用起來很復雜。為了讓使用者連接控制器,提交一項工作和得到相應的結果,你需要用XgridFoundation寫數百行代碼,和管理一個復雜的XgridFoundation要求你的異步調用鏈。
GridEZ框架提供一個使用簡單的對象隱藏了這些復雜度,和提供了大部分你所需要的功能。例如,你提交一項工作,當工作完成之后結果回自動裝載到你的應用,而你要做的僅僅是寫一個代理方法去處理它。如果你從來沒有使用XgridFoundation APIs,你可能不知道困難的是什么。可是如果你知道的話,你已經意識到GridEZ是怎么使你的生活大為輕松了。
云計算 :EC2
Elastic Compute Cloud(EC2)
EC2是由亞馬遜提供的web計算服務,是一個讓使用者可以租用云端電腦運行所需應用的系統。EC2由提供web
服務的方式讓使用者可以彈性地運行自己的Amazon機器映象檔,使用者將可以在這個虛擬機上運行任何自己想要的應用程序。
EC2 與傳統的服務器電腦有以下優勢:
沒有系統管理員
沒有機房的空間
沒有電費賬單
沒有限制的空間
OpenMPI
MPI最大的特點是用戶寫一份單獨的程序卻運行在所有的計算機上。可是因為每一個計算機被賦予一個唯一的標識序列,盡管它只運行相同的代碼,它卻可以為不同的機器上進行不同的操作:
if ( I am processor A ) then
add a bunch of numbers
else if ( I am processor B ) then
multipy a matrix times a vector
end
另一個MPI的特點的特點是單獨數據存儲在各個計算機上。如果一個計算機需要從另一個得到數據,或者發送一個特別的數據到所有其他計算機,它必須單獨調用合適的庫要求數據傳輸。
由于庫路徑的調用,它對發送者和接收者來說要求同時在線(意味著一個人將可能要等待另一個人出現),或者為了以后傳輸發送者在同一時間發送一個消息到緩沖區,允許發送者立即進行再進一步的計算。
這是一個一份程序看起來的簡單例子,在那里數字X被認為被處理器A計算,數字B被處理器B計算。
if ( I am processor A ) then
call MPI_Send ( X )
else if ( I am processor B ) then
call MPI_Recv ( X )
end
open MPI 項目是一個開源的MPI-2層級的實現,由科研機構和合伙公司共同發展和維護的。open MPI可以從各個高性能的計算單位聯合專家知識、技術和資源,從而組建一個最高MPI可行的庫。open MPI向系統和軟件供應商和應用開發者和計算機學者提供很多好處。
不完全列舉open MPI的特點:
完全支持MPI-2 層級
線程和并發安全
支持異構網絡
單一庫支持所有網絡
運行時指令
支持各種操作系統
在各個平臺上的高性能
可移植和容易維護
動態和快速響應的郵件列表
并行程序:OpenMP
OpenMP(Open Multi-Processing)是由OpenMP Architecture Review Board牽頭提出的,并已被廣泛接受的,用于共享內存并行系統的多線程程序設計的一套指導性注釋(Compiler Directive)。
程序員通過在源代碼中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程序進行并行化,并在必要之處加入同步互斥以及通信。當選擇忽略這些pragma,或者編譯器不支持OpenMP時,程序又可退化為通常的程序(一般為串行),代碼仍然可以正常運作,只是不能利用多線程來加速程序執行。
OpenMP提供的這種對于并行描述的高層抽象降低了并行編程的難度和復雜度,這樣程序員可以把更多的精力投入到并行算法本身,而非其具體實現細節。對基于數據分集的多線程程序設計,OpenMP是一個很好的選擇。同時,使用OpenMP也提供了更強的靈活性,可以較容易的適應不同的并行系統配置。線程粒度和負載平衡等是傳統多線程程序設計中的難題,但在OpenMP中,OpenMP庫從程序員手中接管了部分這兩方面的工作。
例子
在 omp parallel 段內的程序代碼由多線程來執行:
int main(int argc, char* argv[])
{
#pragma omp parallel
printf("Hello, world.n");
return 1;
}
GPU 編程: OpenCL
OpenCL (Open Computing Language,開放計算語言) 是一個為異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成。OpenCL由一門用于編寫kernels (在OpenCL設備上運行的函數)的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務分割和數據分割的并行計算機制。
OpenCL類似于另外兩個開放的工業標準OpenGL和OpenAL,這兩個標準分別用于三維圖形和計算機音頻方面。OpenCL擴展了GPU用于圖形生成之外的能力。OpenCL由非盈利性技術組織Khronos Group掌管。
OpenCL 是基于C的一個程序語言,在軟件上,分為Platform Layer、Runtime、Compiler三個部分。
?Platform Layer用來管理計算裝置,提供初始化裝置的界面,并用來建立compute contexts和work-queues
?runtime 用來管理資源,并執行程序的kennel
?編譯器則是 ISO C99的子集合,并加上Open CL特殊的語法。
在OpenCL的執行模型中,有所謂的Compute Kenel 和Compute Program。Compute Kenel基本上類似于CUDA定義的kenel,是最基本的計算單元;而Compute Program則是Compute Kernel和內建函數的集合,類似一個動態函數庫。而應用程序則是會把要執行的compute kernel排序,在執行時則可以依序或不依序來執行。
在平行計算方面,有data-parallel和task-parallel兩種不同計算模型。