并行计算部分总结
1。計算機的峰值為主頻x4。
2。計算機讀取數組時,一次會讀入一行,要最大限度的利用已讀入的數據,減少頻繁讀寫的次數。
3。多線程內存共享,多進程需要消息傳遞來交換變量。
4。利用管道在不同程序之間傳遞內容(可以是管道符|或mkfifo mypipe)
5。平均不同節點的計算量,盡量做到負載平衡。
6。數據分塊是每塊大小盡可能為cache的1/3。
7。MPI_CHAR 為一個字符,但不一定是一個字節。
8。在MPI_Init()之后再處理命令行參數。
9。MPI_Recive()出現在MPI_Send()前一定阻塞。
10。讓計算和通信重疊進行,通常先等待receive的完成,然后做計算,再等待send的完成。
11。采用MPI_Test()檢測傳輸是否結束時,需要再調用MPI_Wait()或MPI_Request_free(),指針釋放后要置為空指針。
12。在分析復雜問題時,可簡化為有限元分析。
13。分析并行程序要有并行的思想,看多個并發的結果,要考慮不同進程的速度對結果的影響。
14。盡量避免多個進程同時讀寫同一個變量,常用解決辦法是加鎖。
15。對于危險區域(可能涉及到多個進程的變量)要加上個障礙,然后看看去掉障礙后有什么影響。
16。保證等號左邊的變量在任何進程是唯一的。
17。MPI無全局變量,各個變量分布在不同節點上,屬于節點私有。因此在矩陣存儲后,索引會發生變化。
18。ps auwx | grep myc可獲得進程號 gdb myc pid(進程號)
19。c的程序可打印出進程號以便調試getpid() or getppid()。
20。在共享內存的并行機中所有的全局變量由不同的處理器共享,要避免對同一個變量的同一讀寫,加鎖,柵欄。
21。柵欄能夠使不同的進程同步,當一個進程到達柵欄時,它等待所有的相關進程到達柵欄再繼續執行,避免了不同程序的賽跑比賽。
22。并行程序多為數據并行,程序中的循環是并行的出發點,有時候循環中的并行需要通過轉換才比較明顯,要有好的任務調度。
23。降低進程中依賴性的方法:采用局部變量,代碼轉換,采用特殊的調度技術。
24。數組間接索引時不能保證數組的元素不具有重復。
25。MPI編程子程序會被拷貝到每個處理器上。
26。定義數據類型可以使數據作為一個整體進行發送,減少通信開銷。
27。數據在內存中存放時按塊進行,內存線讀取數據時也是讀取一定寬度的數據。因此要保證數據存放在一個快中。
28。32位系統double的對界量是4。
29。定義結構體時,讓長數據類型在前,短數據類型最好為4的倍數。
30。MPI_Aint一種數據類型,
31。兩個數據等效是指這兩個數據在內存中分布相同,上下界一樣。
32。prev = (nprocs + myrank - 1) % nprocs; next = (myrank + 1) % nprocs;(myrank為當前進程號,nprocs為總進程數)
33。并行計算的效率達到100%甚至更高時的原因是減少了數據在硬盤個內存中多次讀取,利用并行機的大內存節省時間。
34。SMP(shared memory processors)共享內存的并行機上并行的關鍵是減少同步、負載平衡。
35。數據類型的域表示數據被訪問一次之后在內存中的偏移量,與數據類型的大小沒有直接關系,可通過MPI_UB的偏移量來設定域指定數據的相對移動。
--------2010。06。08更新--------------
36。MPI_Sendrecv(dst,src)的dst是指本進程發送出去的目的地,src是指本進程接收數據的源地址。
37。發送連續的數據類型時,下個數據的起始為緊鄰前一個數據末尾的后一個元素。
----------------------------------------------------------------
MPI
20。阻塞型函數需要等待指定操作的實際完成,或至少涉及的數據已被MPI系統安全地備份后才返回。MPI_Send調用返回時表明數據已被發出或被MPI系統復制,隨后對發送緩沖區的修改不會改變所發送的數據。而MPI_Recv返回時表明數據接收已經完成。阻塞型函數的操作是非局部的,它的完成可能需要與其它進程進行通信。阻塞型函數使用不當容易引起死鎖。非阻塞型函數的調用總是立即返回,而實際操作則由MPI系統在后臺進行。用戶必須隨后調用其它函數來等待或查詢操作的完成情況。在操作完成前對相關數據區的操作是不安全的,因為隨時可能與正在后臺進行的操作發生沖突。非阻塞型函數的調用是局部的,因為它的完成不需要與其它進程進行通信??梢詫崿F計算與并行的重疊進行。
21。一個MPI數據類型由兩個n元序列構成,n為正整數,第一個序列包含一組數據類型,稱為類型序列Typesig = {type0,type1,……,typen}.第二個序列包含一組整數位移,稱為位移序列Typedisp = {disp0,disp1,……,dispn}。位移序列中位移總是以字節為單位計算的。類型序列刻劃了數據的類型特征,位移序列刻劃了數據的位置特征。類型序列和位移序列的元素一一配對構成的序列Typemap = {(type0,disp0),(type1,disp1),……,(typen,dispn)}稱為類型圖。假設數據緩沖區的起始地址為buff,則由上述類型圖所定義的數據類型包含n+1快數據,第i塊的地址為buff+dispi,類型為typei。
22。位移序列中的位移不必是單調上升的,表明數據類型中的數據塊不要求按順序存放。位移也可以是負的,即數據類型中的數據可以位于緩沖區起始地址之前。
23。數據類型的大小指該數據類型中包含的數據長度(字節數),它等于類型序列中所有基本數據類型的大小之和。數據類型的大小就是消息傳遞時需要發送或接收的數據長度。
24。數據類型的下界定義為數據的最小位移。數據類型的上界定義為數據的最大位移加1,再加上個使得數據類型滿足操作系統地址對界要求的修正量。數據類型的域定義為上界與下界之差。
25。一個數據類型的對界量定義如下:原始數據類型的對界量由編譯系統決定,而復合數據類型的對界量則定義為它的所有基本數據類型的對界量的最大值。地址對界要求指一個數據類型在內存中的(字節)地址必須是它的對界量的整數倍。
26。MPI_Type_vector和MPI_Type_hvector唯一的區別是前者的stride以oldtype的域為單位,后者以字節為單位。前者的可移植性更強。
27。以字節作位移通常是不可移植的,用字節作位移單位時使用MPI_Aint,是相對于緩沖區的偏移量。
28。MPI_Type_indexed與MPI_Type_vector的區別在于每個數據塊的長度可以不同,數據塊間也可以不等距。
29。MPI_Type_struct與MPI_Type_hindexed的區別在于各數據塊可以由不同的數據類型構成,處理不同類型時只能用struct。
30。數據類型使用之前要提交,用完要釋放。中間類型可不用提交,同時一旦創建了下一個數據類型,即可將其依賴類型釋放。
31。相鄰兩個數據塊的位移差為兩個數據塊頭到頭的位移差。
32。MPI_Pack常用于少量的混亂的發送次數少的數據,數據在打包、拆包前position都需要初始化為零。
33。經過MPI_Pack打包后的數據發送時MPI_Send中的count為緩沖區的字節數。
34。MPI_Pack_size返回一個數據打包后的大小,可用來計算所需的緩沖區的長度。
35。聚合通信函數要求所有進程都調用。
36。MPI_Gather中recvcount為每個進程收到的數,而不是全體進程count求和。
37。MPI_Alltoall相當于將數據/進程進行依次轉置。假設一個二維數組按行分塊存儲在各個進程中,則調用該函數可很容易地將它變成按列分塊存儲在各進程中。
總結
- 上一篇: 学习生物信息的系列书籍
- 下一篇: 种草!这只鹅虽然没有什么用,但是好可爱呀