2010年9月12日 星期日

多核與多緒…

很久前曾經看過一篇文章提供 CPU 多核的發展目的,有興趣可以參考這裡,底下還有中文翻譯,相當詳細

http://www.zdnet.com.tw/white_board/intel/video-1.htm

大概就是說明 CPU 為何不繼續向上發展更快的頻率,而選擇朝多核心發展,CPU 的頻率已經停留在每秒 3.xG 很久了,根據摩耳定律,我們很快就可以得到速率高達 10G 以上的 CPU,但根據效率來看,從 3.0G 升級到 3.4G 僅僅增加了 13% 的速度,CPU 的功率消粍卻會比原本增加約 73% 左右,如此看來似乎很不實際。

於是聰明的工程師想到將 1 個 1G 和 1 個 600M 的 CPU 串在一起跑,
功率僅比原本多消粍 13% 左右,平均效率卻提升了 73%

結論為選擇了使用了摩耳定理的縮小 1 倍,換取增加 1 倍速度,於是將晶片縮小,發展雙核、4 核、8 核等多核 CPU 成為了主流,多核並不是將多顆同樣頻率的 CPU 放在一起,往往會採用速度快的 CPU 配上速度中等的 CPU 以達到最佳的運算效率,因為多數簡單的指令在非常快的 CPU 上和普通的 CPU 上執行時間是差不多的,這不僅關係到能源的粍損效率,還關係到RAM記憶體的速度,若我們真的有 10G 的 CPU,RAM 的速度卻沒有突飛猛進的成長,那麼這顆 CPU 也只是將時間花在空轉等待RAM的讀取罷了。

這裡紀錄一下如何使你的程式可以支援多核的運作環境,

以下是一段簡單的 C++ code


#include <omp.h>

int main()
{
  #pragma omp parallel for
  for(int i = 0; i < 32; i++)
  {
    cout << "thread" << omp_get_thread_num() << ": " << i;
  }
}


int omp_get_thread_num() 可以用來取得 CPU 的索引號,記得要引入 omp.h 檔案,在不做任何事的情況下可以得到很直觀的結果


thread 0: 0
thread 0: 1
thread 0: 2
thread 0: 3
thread 0: 4
thread 0: 5
thread 0: 6
...
thread 0: 31


這時我們到以下路徑將值改為 "Yes"
專案 || 屬性 || 組態屬性 || C/C++ || 語言 || OpenMP
這可以讓你的 for 迴圈在多核心的環境利用平行處理產生較佳的效率,這時我們可能會得到這樣的結果


thread 0: 0
thread 0: 1
thread 1: 2
thread 0: 3
thread 1: 4
thread 1: 5
thread 1: 6
...
thread 0: 31


開啟 OpenMP 編譯選項可以令程式碼以多核的方式執行,將 OpenMP 打開並不會在單核或雙核的環境下造成什麼樣的差別,只正在執行時間較長的迴圈適時的使用多核平行運算可以增加不少效率,但 OpenMP 並不是太聰明,複雜的流程工作我們還是得靠 Multi Thread 的方式來實作,撰寫多緒程式時,就要特別注意鎖定的問題,同時因為兩個鎖定的 Thread 在等待彼此解鎖的死結狀況也是要特別小心的。

沒有留言:

張貼留言