並行程式設計整理(一)

2021-10-08 15:44:40 字數 2137 閱讀 5329

關於並行程式,首先思考它的目的,具體來說:

為什麼我們要不斷提高效能?因為計算能力的提公升是很多鄰域能夠進步的核心。

為什麼我們要建立並行系統?因為對於單處理器而言,其效能的提公升實際是提高了處理器上電晶體的密度,但受限於散熱問題等,密度無法一直提公升。如果考慮並行化,即生產多個相對簡單的完整處理器放在乙個晶元上,即多核處理器,就能解決密度問題。

為什麼我們要寫並行程式?編寫並行程式是為了充分發揮多核處理器的優勢,然而將序列程式改寫成並行程式並不順利。

關於並行程式和序列程式,舉乙個例子,假設要計算n

nn個數的值,並求它們的和。對於這個問題,序列**解法如下:

sum =0;

for(i =

0; i < n; i++

)

現假設計算機有p

pp個核,且p

<

<

np << n

p<

<

n,那麼每個核只需處理約n

p\dfrac

pn​個數的求值及加和,此時**如下:

my_sum =0;

my_first_i =..

.;my_last_i =..

.;for(my_i = my_first_i; my_i < my_last_i; my_i++

)

上面**中的my_開頭的變數代表了每個核的私有變數。

當每個核計算得到自己的my_sum後,這些核把這個結果傳送給核master,由master這個核來計算總和sum

if

(ismastercore)

}else

當然,讓master完成最終的求和並不是最優解,在核數足夠多的情況下,可以採取如下策略:讓0號核加上1號核的值,2號核加上3號核的值,以此類推,即偶數號核加上其後一號的核對應的值;然後讓0號核加上2號核的值,4號核加上6號核的值……

雖然最優解聽上去很完美,但是卻難以作為一套方案通過編寫並行程式來實現。因此才會有上面提到的,改寫不順利,但不能因為不順利就浪費掉多處理器的能力。

這個問題取決於如何在核心間劃分工作的想法。主流的劃分方法有:任務並行(task-parallelism)資料並行(data-parallelism)。顧名思義:

在上面提到的求值並求和的例子中,master和其餘核就是任務並行的乙個例項,而除了master以外的這些核在做求值和加法運算的過程就是乙個資料並行的例項。

編寫並行程式過程中需要協調的問題:

通訊(communication)負載均衡(load balancing)同步(synchronization)這裡學習三種不同的c擴充套件:

在學習的過程中,將重點關注兩種主要型別的並行系統:共享記憶體系統 (shared-memory system)和分布式記憶體系統 (distributed-memory system)。

在共享記憶體系統中,核心可以共享對計算機記憶體的訪問;原則上,每個核都可以讀寫每個記憶體位置。(pthreads, openmp)

在分布式記憶體系統中,每個核都有自己的私有記憶體,核必須通過通過網路傳送訊息之類的方式顯式通訊。(mpi)

上圖中,圖(a)是共享記憶體系統,圖(b)是分布式記憶體系統。

併發計算中,乙個程式是指在任何時刻都可以同時進行多個任務的程式。

並行計算中,乙個程式是指多個任務緊密合作來解決乙個問題的程式。

分布式計算中,乙個程式可能需要與其他程式合作來解決乙個問題。

// 以上內容整理自《introduction to parallel programming》一

OpenMP並行程式設計(一)

openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...

OpenMP並行程式設計(一)

openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...

OpenMP並行程式設計(一)

openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...