實作支援多處理器(SMP)操作的程式
其實多核心早已不是新技術,還記得多年前,多處理器架構(SMP)早就廣泛應用在伺服器的硬體上,只是要在頂級的硬體規格才看得到。當時,伺服器專用的 CPU 實在是貴得嚇死人,頂級的伺服器配備兩顆以上的 CPU 後,更是價格喊到天價,就如同今日的 CPU 有『多核心』加持一般,在價格上的氣勢也因此莫名的居高不下。但是,我們真的有用到多處理器﹝多核心﹞架構的好處嗎?就連掌控 CPU 運算的多數程式設計人員大概從不曾想過這個問題,更不用說一般無知的消費者了。
以下是一個指定 CPU 來處理運算的例子:
關鍵的註解
後記
指定 CPU 處理運算在實際應用面上,可以將需要大量運算的工作分散給所有的 CPU 同時處理,或是也可以,控制某些特定功能的程式盡量利用同一顆 CPU 的 Cache ,避免資料分散,以增加 Cache 存取的速度。
備註:本文所講的內容是架構在 Linux 2.6 版核心之上的系統。
以下是一個指定 CPU 來處理運算的例子:
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
int main(void) {
cpu_set_t cmask;
unsigned long len = sizeof(cmask);
__CPU_ZERO(&cmask); /* 初始化 cmask */
__CPU_SET(0, &cmask); /* 指定第一個處理器 */
/* 設定自己由指定的處理器執行 */
if (!sched_setaffinity(0, len, &cmask)) {
printf("Could not set cpu affinity for current process.\n");
exit(1);
}
return 0;
}
關鍵的註解
- 我們使用 __CPU_SET() 指定處理器,你可以指定 0, 1, 2, 3... 等編號來決定使用哪一顆處理器。
- sched_setaffinity() 是用來將程序轉移到我們所指定的處理器執行,你可以設定程序編號(PID)來選擇要轉移的程序,或是設定 PID 為 0,也就是自己。
後記
指定 CPU 處理運算在實際應用面上,可以將需要大量運算的工作分散給所有的 CPU 同時處理,或是也可以,控制某些特定功能的程式盡量利用同一顆 CPU 的 Cache ,避免資料分散,以增加 Cache 存取的速度。
備註:本文所講的內容是架構在 Linux 2.6 版核心之上的系統。
能指定哪個 function 由哪個 CPU 執行嗎?
回覆刪除在丟給兩個 cpu 執行之後,能等待他們都完成以後才繼續嗎?就類似 pthread_join 那樣??
因為在多處理器的操作,執行權的轉移是以程序為單位。
回覆刪除所以,如果你想要讓某特定 function 指派給不同 CPU 處理,要搭配 clone、fork 等方式產生新的程序。
要等待複製出來的程序結束,可以用 wait() 等方式達成。