并行計算優(yōu)化_第1頁
并行計算優(yōu)化_第2頁
并行計算優(yōu)化_第3頁
并行計算優(yōu)化_第4頁
并行計算優(yōu)化_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

六、CPU/GPU/TPU概述一、并行編程基礎知識五、行計算優(yōu)化四、Python并發(fā)編程方式三、MPI程序分析及編程入門二、MPI編程實例演示提綱一、并行編程基礎知識節(jié)點(node):每個節(jié)點由多個處理器構成,可以直接輸入輸出互聯(lián)網絡(interconnectnetwork):所有節(jié)點通過互聯(lián)網絡相互連接通信。內存(memory):內存由多個存儲模塊組成,這些模塊或者與節(jié)點對稱地分布在互聯(lián)網絡的兩側,或者位于各個節(jié)點的內部并行計算機組成部分內存模塊位于節(jié)點內部并行計算機體系結構內存模塊與節(jié)點分離一、并行編程基礎知識一、并行編程基礎知識一、并行編程基礎知識程序:實現(xiàn)特定目標或解決特定問題而用計算機語言編寫的命令序列的集合,或者稱之為:算法+數據結構。進程:可并發(fā)執(zhí)行的程序在一個數據集合上的運行過程。進程是程序的一次執(zhí)行;進程可以是和別的計算并發(fā)執(zhí)行的計算;進程可以定義為一個數據結構及其能在其上進行操作的一個程序;進程是一個程序及其數據在處理機上順序執(zhí)行時所發(fā)生的活動;進程是程序在一個數據集合上的運行過程,是系統(tǒng)進行資源分配和調度的獨立單位。線程:線程是進程中的一個實體,是被系統(tǒng)獨立調度和分派的基本單位。線程自己基本不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數器、一組寄存器和堆棧),但他與同屬于一個進程中的其他線程共享進程所擁有的全部資源。兩個重要概念:進程與線程一、并行編程基礎知識并行編程通常是指軟件代碼,它促進在同一時間執(zhí)行多個計算任務的性能。Forexample:操場上有20個滑梯而不是一個。孩子們不必排隊等待輪到自己,因為他們可以同時玩。使用電腦鼠標,一邊聽音樂,一邊寫畢業(yè)論文,同時對個人電腦做病毒掃描,這唯一的理由就是并發(fā)編程。在這種情況下,它的多重任務允許多個程序或進程訪問CPU而沒有等待。這一設置允許使用多任務共享的資源進行密集的I/O處理和有效的信號處理。并發(fā)性也可以通過實施多個計算線程發(fā)生(通常采用交錯啟動和完成點)。這叫做多線程,并且它發(fā)生在一個單一的進程或程序中。這就是為什么你可以打印一個文檔,同時繼續(xù)編輯另一個文檔。如果沒有多線程,UI會太慢,因為系統(tǒng)將無法在同一時間應對多個用戶操作。并行編程概述一、并行編程基礎知識并行編程模式,主要指并行編程時,程序員將程序各模塊并行執(zhí)行時,模塊間的通信方式,目前并行編程模式主要包括以下三種:共享內存:共享內存是進程間傳遞數據的一種高效方法。在共享內存模型中,并行進程共享一個進行異步讀取的全局地址空間。異步并發(fā)訪問可能導致條件競爭,因此需要同步機制來避免條件競爭,這些機制包括鎖,信號量,管程(monitor)。傳統(tǒng)的多核處理器是直接支持共享內存的,所以導致很多利用該特性的語言和庫出現(xiàn),以OpenMP為代表;消息傳遞:在消息傳遞模型中,并行進程是通過消息傳遞來交換數據的。這些通信可以是異步的,即消息可以在接收者做好準備前發(fā)送,也可以是同步的,即只有接受者準備好接收消息時才能發(fā)送。消息傳遞的CSP(Communicatingsequentialprocesses)模型使用同步通信channel來連接進程,以MPI,PVM為代表;數據并行模式:數據并行化關注在數據集上執(zhí)行的操作。一組任務對數據集進行運算,但是會對不同的分區(qū)進行運算,以Fortran為代表。并行編程模式一、并行編程基礎知識MassagePassingInterface:是消息傳遞函數庫的標準規(guī)范;由MPI論壇開發(fā).支持Fortran、C和C++;一種新的庫描述,不是一種語言。什么是MPI?消息傳遞并行程序設計用戶必須通過顯式地發(fā)送和接收消息來實現(xiàn)處理機間的數據交換。每個并行進程均有自己獨立的地址空間,相互之間訪問不能直接進行,必須通過顯式的消息傳遞來實現(xiàn)。這種編程方式是大規(guī)模并行處理機(MPP)和機群(Cluster)采用的主要編程方式。并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法由于消息傳遞程序設計要求用戶很好地分解問題,組織不同進程間的數據交換,并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法.消息傳遞是當前并行計算領域的一個非常重要的并行程序設計方式一、并行編程基礎知識下面我們以C語言的形式給出一個最簡單的MPI并行程序Hello(下頁).該程序在終端打印出HelloWorld!字樣.“HelloWorld”:一聲來自新生兒的問候.二、MPI編程實例演示從簡單入手!Helloworld(C)#include<stdio.h>#include"mpi.h“main(

int

argc, char*argv[]){

MPI_Init(&argc,&argv);

printf("Hello,world!\n");

MPI_Finalize();}二、MPI編程實例演示Helloworld(Fortran)二、MPI編程實例演示programmaininclude‘mpif.h’integerierrcallMPI_INIT(ierr)print*,'Hello,world!'callMPI_FINALIZE(ierr)endMPI程序的的編譯與運行mpicc–ohellohello.c生成hello的可執(zhí)行代碼.mpirun–np4hello4指定np的實參,表示進程數,由用戶指定.hello要運行的MPI并行程序.%小寫onp:Thenumberofprocess.二、MPI編程實例演示SPMD:SingleProgramMultipleData(MIMD)

::::#include"mpi.h"#include<stdio.h>main(

int

argc,char*argv[]){

MPI_Init(&argc,&argv);

printf("Hello,world!\n");

MPI_Finalize();}#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}HelloWorld!HelloWorld!HelloWorld!HelloWorld!#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}Hello是如何被執(zhí)行的?三、MPI程序分析及編程入門C必須包含mpi.h.MPI函數返回出錯代碼或

MPI_SUCCESS成功標志.MPI-前綴,且只有MPI以及MPI_標志后的第一個字母大寫,其余小寫.MPI函數的參數被標志為以下三種類型:IN:參數在例程的調用中不會被修正.OUT:參數在例程的調用中可能會被修正.INOUT:參數在一些例程中為IN,而在另一些例程中為OUT.C語言中MPI函數約定三、MPI程序分析及編程入門在寫MPI程序時,我們通常需要知道以下兩個問題的答案:任務由多少個進程來進行并行計算?我是哪一個進程?

開始寫MPI并行程序三、MPI程序分析及編程入門開始寫MPI并行程序MPI提供了下列函數來回答這些問題:用MPI_Comm_size

獲得進程個數p

int

MPI_Comm_rank(MPI_Comm

comm,int*rank);用MPI_Comm_rank

獲得進程的一個叫rank的值,該

rank值為0到p-1間的整數,相當于進程的ID

int

MPI_Comm_size(MPI_Comm

comm,int*size);三、MPI程序分析及編程入門MPI基本函數int

MPI_Init(

int* argc/*in/out*/, char** argv[]/*in/out*/)通常應該是第一個被調用的MPI函數除MPI_Initialized()外,其余所有的MPI函數應該在其后被調用MPI系統(tǒng)將通過argc,argv得到命令行參數三、MPI程序分析及編程入門MPI基本函數intMPI_Finalize(void)退出MPI系統(tǒng),所有進程正常退出都必須調用。表明并行代碼的結束,結束除主進程外其它進程.串行代碼仍可在主進程(rank=0)上運行,但不能再有MPI函數(包括MPI_Init())三、MPI程序分析及編程入門MPI基本函數intMPI_Comm_size( MPI_Commcomm/*in*/, int* size/*out*/)獲得進程個數size指定一個通信子,也指定了一組共享該空間的進程,這些進程組成該通信子的group.獲得通信子comm中規(guī)定的group包含的進程的數量.三、MPI程序分析及編程入門MPI基本函數int

MPI_Comm_rank(MPI_Comm

comm/*in*/,

int* rank/*out*/)得到本進程在通信空間中的rank值,即在組中的邏輯編號(該rank值為0到p-1間的整數,相當于進程的ID)。三、MPI程序分析及編程入門MPI程序的基本結構#include"mpi.h"......intmain(int

argc,char*argv[]){

int

myrank,nprocs;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&nprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myrank); ......

MPI_Finalize();}三、MPI程序分析及編程入門更新的HelloWorld(c)#include<stdio.h>#include"mpi.h"main(int

argc,char*argv[]){

int

myid,

numprocs;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

printf(“Iam%dof%d\n",myid,numprocs);

MPI_Finalize();}三、MPI程序分析及編程入門mpicc–ohello1hello1.cmpirun-np4hello1Iam0of4Iam1of4Iam2of4Iam3of4更新后的的HelloWorld的允許結果三、MPI程序分析及編程入門MPI調用借口的總數雖然龐大,但根據實際編寫MPI的經驗,常用的MPI調用的個數確什么有限。下面是6個最基本的MPI函數。MPI_Init(…);MPI_Comm_size(…);MPI_Comm_rank(…);MPI_Send(…);MPI_Recv(…);MPI_Finalize();MPI_Init(…);…并行代碼;…MPI_Fainalize();只能有串行代碼;最基本的MPI三、MPI程序分析及編程入門SPMD編程模式:構成一個程序的所有進程運行的是同一份執(zhí)行代碼.不同進程根據自己的序號可能執(zhí)行該代碼中的不同分支.MPI編程中最常用的編程方式.用戶只需要編寫、維護一份源代碼.MPMD編程模式:構成一個程序的不同進程運行不同的執(zhí)行代碼.用戶需要編寫、維護多份源代碼.主/從編程模式:它是MPMD編程模式的一個特例,也是MPMD編程模式中最常見的方式.構成一個程序的進程之一負責所有進程間的協(xié)調及任務調度,該進程稱為主進程(Master),其余進程稱為從進程(Slave).通常用戶需要維護兩份源代碼.MPI編程模式三、MPI程序分析及編程入門MPI程序設計方法明確并行任務設計單個任務的串行程序所有任務的統(tǒng)一表示--SPMD并行程序SPMD三、MPI程序分析及編程入門線程(Thread)進程(Process)遠程分布式主機(DistributedNode)偽線程(Pseudo-Thread)Python并發(fā)編程四種方式四、Pyhon并發(fā)編程方式多線程幾乎是每一個程序猿在使用每一種語言時都會首先想到用于解決并發(fā)的工具(JS程序員請回避),使用多線程可以有效的利用CPU資源(Python例外)。然而多線程所帶來的程序的復雜度也不可避免,尤其是對競爭資源的同步問題。然而在python中由于使用了全局解釋鎖(GIL)的原因,代碼并不能同時在多核上并發(fā)的運行,也就是說,Python的多線程不能并發(fā),很多人會發(fā)現(xiàn)使用多線程來改進自己的Python代碼后,程序的運行效率卻下降了。實際上使用多線程的編程模型是很困難的,程序員很容易犯錯,這并不是程序員的錯誤,因為我們大多數人的思維是串行(精神分裂不討論),且馮諾依曼設計的計算機架構也是以順序執(zhí)行為基礎的。Python提供兩組線程的接口,一組是thread模塊,提供基礎的,低等級(LowLevel)接口,使用Function作為線程的運行體。還有一組是threading模塊,提供更容易使用的基于對象的接口(類似于Java),可以繼承Thread對象來實現(xiàn)線程,還提供了其它一些線程相關的對象,例如Timer,Lock。線程(Thread)四、Pyhon并發(fā)編程方式由于python的全局解釋鎖問題,Python下比較好的并行方式是使用多進程,這樣可以非常有效的使用CPU資源,并實現(xiàn)真正意義上的并發(fā)。當然,進程的開銷比線程要大,也就是說如果你要創(chuàng)建數量驚人的并發(fā)進程的話,需要考慮一下你的機器是不是有一顆強大的心。由于線程共享相同的地址空間和內存,所以線程之間的通信是非常容易的,然而進程之間的通信就要復雜一些了。常見的進程間通信有:管道,消息隊列,Socket接口(TCP/IP)等等。Python的mutliprocess模塊提供了封裝好的管道和隊列,可以方便的在進程間傳遞消息。Python進程間的同步使用鎖,這一點和線程是一樣的。Python還提供了進程池Pool對象,可以方便管理和控制線程。python的mutliprocess模塊和threading具有類似的接口。線程(Thread)四、Pyhon并發(fā)編程方式隨著大數據時代的到臨,摩爾定理在單機上似乎已經失去了效果,數據的計算和處理需要分布式的計算機網絡來運行,程序并行的運行在多個主機節(jié)點上,已經是現(xiàn)在的軟件架構所必需考慮的問題。遠程主機間的進程間通信有幾種常見的方式(1)TCP/IP:TCP/IP是所有遠程通信的基礎,然而API比較低級別,使用起來比較繁瑣,所以一般不會考慮(2)遠程方法調用RemoteFunctionCall:RPC是早期的遠程進程間通信的手段。Python下有一個開源的實現(xiàn)RPyC(3)遠程對象

RemoteObject:遠程對象是更高級別的封裝,程序可以想操作本地對象一樣去操作一個遠程對象在本地的代理。遠程對象最廣為使用的規(guī)范CORBA,(4)消息隊列MessageQueue:比起RPC或者遠程對象,消息是一種更為靈活的通信手段,常見的支持Python接口的消息機制有遠程分布式主機(DistributedNode)四、Pyhon并發(fā)編程方式還有一種并發(fā)手段并不常見,我們可以稱之為偽線程,就是看上去像是線程,使用的接口類似線程接口,但是實際使用非線程的方式,對應的線程開銷也不存在的。greenlet提供輕量級的coroutines來支持進程內的并發(fā)。偽線程(Pseudo-Thread)四、Pyhon并發(fā)編程方式決定性能調優(yōu)上限的兩個定律:阿曼達定律和Gustafson定律;系統(tǒng)的性能遵循木桶原理,也就是整體性能是由系統(tǒng)中最短的那塊板決定;整個優(yōu)化應該采用自上而下的方法,順序一定不能亂。并行調優(yōu)需要注意的方面五、并行計算優(yōu)化首先通過標準性能基準測試程序確保系統(tǒng)的工作狀態(tài)正常,比如使用SpecInt,SpecFP,Linpack等得到處理器的性能,對比設計性能指標,可以得知CPU是否工作正常,BIOS或者操作系統(tǒng)中的相關設置是否正確。使用Stream測試程序測試內存系統(tǒng)的性能,Netperf測試網絡性能,F(xiàn)io或者iozone等測試文件系統(tǒng)性能是否正常。在所有調優(yōu)開始之前,一定要先把基礎做好,一定要了解你的系統(tǒng)性能極限;再來是應用調優(yōu),可以調節(jié)運行環(huán)境,或者有代碼的可以調整代碼;最后才會到處理器級別的調優(yōu),這里是榨干最后一滴性能的地方。如何自上而下并行調優(yōu)五、并行計算優(yōu)化35/122(一)硬件級:性能優(yōu)化的方法有很多種,第一個叫硬件級調優(yōu),就是簡單粗暴直接換掉性能低的硬件,比如網卡千兆換到萬兆,硬盤從機械的換成SSD等等。很多時候這也不失為一個好辦法。(二)運行級:所謂運行級調優(yōu),從運行環(huán)境上調整,通過監(jiān)控整個系統(tǒng)的性能及各項指標看問題所在,然后看能不能通過一些運行參數的調整,比如說內存的使用率非常高,可以試試在操作系統(tǒng)中調整內存頁的大小。如果是網絡帶寬壓力特別大,可以試試將網絡包的處理程序綁定在某一個核上面。對于網絡小包特別多的情況,有一些網卡帶包聚合功能,等很多小包會聚合到一定的程度,再統(tǒng)一處理,大量減少中斷數量,降低系統(tǒng)消耗。這些調整的成本很低,難點在于對技術人員要求很高,需要對整個系統(tǒng)非常熟。并行計算系統(tǒng)性能調優(yōu)方法分類五、并行計算優(yōu)化(三)編譯器級:編譯器級調優(yōu),需要有代碼,但是不修改代碼,使用編譯器的優(yōu)化選項,有的時候也能夠獲得巨大的性能提高。比如引入自動向量化,深度優(yōu)化,性能剖析指導的優(yōu)化(PGO)等等。需要技術人員熟悉編譯的使用,以及對優(yōu)化過程的理解。(四)代碼級:代碼級調優(yōu)就是直接改動實現(xiàn)代碼,改代碼收益或許非常大,比如換個算法,因為有的算法就是比別的算法快很多倍,甚至快幾個數量級,但是修改的難度極其大,成本極高,代碼改了以后正確性要重新驗證,所有測試的步驟都要做。在原有串行單線程程序中,如果有比較明顯的計算密集型循環(huán),可以引入OpenMPI進行并行化,結合編譯器的自動向量化編譯選項,可以只改極小一部分代碼,獲得比較大的性能收益。在性能調優(yōu)中常用的一些關鍵指標:系統(tǒng)性能指標包括CPU利用率、內存使用率,swap分區(qū)、帶寬使用率;處理器性能指標包括CPI、浮點運算的峰值、向量化比例、cachemiss、DTLBmiss等。五、并行計算優(yōu)化并行計算系統(tǒng)性能調優(yōu)方法分類11.串行代碼優(yōu)化從以下幾個角度分析:系統(tǒng)級:需要分析出性能控制因素,例如網速,利用率,負載均衡。如果CPU使用率不高且很穩(wěn)定,則需要優(yōu)化內存帶寬,若CPU使用率忽上忽下,則需要考慮其他進程占用CPU。當然,CPU大多時候空閑,說明沒有很大程度上發(fā)揮硬件計算能力,或者,訪問帶寬太小,或者CPU在等待其他進程,線程釋放資源等。應用級別:通常有編譯選項,調用高性能庫,去掉全局變量等;算法級:函數級,循環(huán)級,語句級,指令級。??代碼級調優(yōu)之串行代碼優(yōu)化五、并行計算優(yōu)化CPU、GPU、TPU的區(qū)別六、CPU/GPU/TPU概述TPU—張量處理器TensorProcessingUnitCPU—央處理器C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論