2007年10月5日 星期五

實作支援多處理器(SMP)操作的程式

Standard
其實多核心早已不是新技術,還記得多年前,多處理器架構(SMP)早就廣泛應用在伺服器的硬體上,只是要在頂級的硬體規格才看得到。當時,伺服器專用的 CPU 實在是貴得嚇死人,頂級的伺服器配備兩顆以上的 CPU 後,更是價格喊到天價,就如同今日的 CPU 有『多核心』加持一般,在價格上的氣勢也因此莫名的居高不下。但是,我們真的有用到多處理器﹝多核心﹞架構的好處嗎?就連掌控 CPU 運算的多數程式設計人員大概從不曾想過這個問題,更不用說一般無知的消費者了。

以下是一個指定 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 版核心之上的系統。