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

其實多核心早已不是新技術,還記得多年前,多處理器架構(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 版核心之上的系統。

留言

  1. 能指定哪個 function 由哪個 CPU 執行嗎?

    在丟給兩個 cpu 執行之後,能等待他們都完成以後才繼續嗎?就類似 pthread_join 那樣??

    回覆刪除
  2. 因為在多處理器的操作,執行權的轉移是以程序為單位。
    所以,如果你想要讓某特定 function 指派給不同 CPU 處理,要搭配 clone、fork 等方式產生新的程序。
    要等待複製出來的程序結束,可以用 wait() 等方式達成。

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄