序列 amp 並行程式在效率上的簡單比較

2021-05-25 23:08:08 字數 2646 閱讀 1747

開頭:

這是老師在開學時布置的一道作業題目,完整問題為:「多核與單核的cpu在執行序列、並行程式時時,在效率上的差別。」 以前雖然常常聽說多核,但是卻沒有去多了解下並行程式和序列程式,這次作業也算對這些概念有些熟悉。

多核興起:

20世紀40年代第一台電子管計算機的發明標誌計算工具進入了乙個嶄新的時代。20世紀50年代末,電晶體的發現促成了計算機技術的

一大飛躍,其效能先之電子管計算機數十倍到數百倍以上。而之後積體電路時代的到來又為計算機的發展開闢了乙個新的里程。

20世紀70年代,積體電路技術能夠將計算機的控制單元和算術邏輯單元整合到乙個晶元上製成了微處理器晶元。之後,對計算機效能

的提公升研究主要集中在對微處理器的效能的提高。傳統的提高處理器效能的方法主要有三種途徑: (一)提高主頻;(二)優化技術,採

用功能更強大的指令,流水處理的技術;(三)增加cache的容量。

近年來,通過提高處理器主頻來提公升處理器效能的方法已經不大可能有大的進展,因而業界對處理器效能的提公升逐漸轉向了超執行緒、

多核、快取等技術。其中,多核是目前乙個熱點。

並行程式設計:

在以往,硬體技術的提公升不會對執行其上的軟體帶來影響,而多核的誕生為其提出的一些難題。之前的應用程式都是針對乙個運算核

心而設計,而當處理器的架構公升級為多核時,以前的應用程式便不能夠充分地利用多核的優勢,甚至會造成效能的下降。因而,隨著多核

漸行,今後程式設計師所將面臨的挑戰便是開發針對多核的並行程式。

並行程式的設計目標是挖掘問題求解過程中的並行性,尋求並行演算法與並行機器體系結構的最佳匹配和對映,合理組織並行任務,減

少額外訊息傳遞和資料移動開銷。目前,開發乙個並行程式可以有三種途徑,乙個途徑是序列程式自動並行化。第二條途徑是設計全新的

訊息傳遞和並行。這正是mpi和openmp所採取的途徑。目前也是比較容易被接受且效能高的途徑。但其程式開發效率很低,難度也比較大。

需要注意的是,並行執行的程式實際上沒這麼簡單。在工作的切割、結合上,也是要多花時間的,所以在現實中,即使最佳狀況,雙

核心的效能也不會是 1 + 1 = 2 這樣的理想化。除此之外,也不是所有工作都是可以切割的!很多任務作是有關聯性的,這樣如果直接切

割給不同的處理核心各自去平行運算,出來的結果是肯定有問題的。而且,多執行緒的程式在編寫、維護上,也都比單一執行緒的程式復

雜上不少。

問題回答:

序列程式主要是針對具有單核體系架構的處理器而言的;而並行程式概念興起於多核處理器誕生之後,為解決大規模問題而提出的並

行計算。對於本題而言,給出的結論為:

?·· 對於序列程式,因為程式經過編譯過後沒有並行區域,也即不能夠派生到多個核當中執行,因此其在單核和多核上執行的時間是

等同的。

?·· 對於並行程式,在多核與單核上執行的效率往往與程式所要解決的問題的規模有關。平行計算追求的理想情況是採用p個處理器就

能得到p陪速度的提公升,但這很難達到,因為平行計算會引入一些額外的開銷,也即前面提到的並行程式並不是簡單的「切割」到多個處

理器(多核)中去。總之,對於一些小規模的問題,並行程式的效果通常不如序列程式;對於一些較大規模的問題,並行程式的效果要遠

遠好於序列程式,但是不能達到所期望的理想情況。以下是一些例證:

(1)乙個簡單的沒有資料依賴及競爭條件的迴圈程式

code:

#include 

#include 

#include 

using

namespace std;   

typedef

long

int l_int;   

int main(void)   

}   

clock_t t2 = clock();                  // time measuring

cout <<"time = "

<"/n";   

return 0;   

}  

經過測試,在沒有啟用 openmp支援時,整個時間耗費為 0.031s. 在啟用 openmp後,程式中的for迴圈被並行執行,然而其時間耗費卻增加了近一倍,為 0.078s. 處理器加速比:

序列時間耗費/並行時間耗費 = 0.39

(2)乙個較為複雜一些的程式, 計算pi值:

code:

#include 

#include 

int main(void)   

}   

clock_t t2 = clock();                       // time measure

std::cout<<"pi = "

<< sum*stepinterval <<"/n";   

std::cout <<"time = "

<<(double)(t2-t1)/clocks_per_sec <<"/n";   

return 0;   

}   

經測試,在沒有啟用 openmp時,時間耗費為 0.125。啟用openmp之後, 時間耗費為 0.062。 處理器加速比:

序列時間耗費/並行時間耗費 = 2.0

綜上實驗所述,能夠說明之前提出的結論。

序列 並行程式在效率上的簡單比較

分類 multi x 2010 10 15 10 33 1198人閱讀 收藏舉報 parallel 工作程式開發 作業語言測試 開頭 這是老師在開學時布置的一道作業題目,完整問題為 多核與單核的cpu在執行序列 並行程式時時,在效率上的差別。以前雖然常常聽說多核,但是卻沒有去多了解下並行程式和序列程...

OS X上基於OpenMP進行並行程式開發

openmp是目前被廣泛接受的,用於共享記憶體並行系統的多處理器程式設計的一套指導性的編譯處理方案。它提供了對並行演算法的高層的抽象描述,程式設計師通過在源 中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程式進行並行化,並在必要之處加入同步互斥以及通訊。在windows下利用visu...

C C 序列程式優化 提高記憶體讀寫效率

作業系統使得計算機硬體對程式設計師透明,即程式設計師在寫 時不用考慮機器到底如何工作。但是了解cpu內快取記憶體的作用能幫助程式設計師設計出更高效的 下面簡單介紹一下cpu內的快取記憶體和程式優化方法 計算機中cpu的工作頻率 2 4ghz 高於記憶體的工作頻率 1 2ghz 但是程式執行時cpu需...