pthread 開的玩笑

因為研究的關係,我必須找到一個方法讓單一程式在執行時能夠完全利用機器上所有的 physical/logical processors (故 SMP, Multi-core, HTT等都在此列中),像這樣必須平行計算的例子,我馬上想到不是使用 pthread 就是 OpenMP 這些函式庫。

一開始,老師希望我跑的一個程式,「聽說是」用 pthread 來達到平行運算的效果,可是根據過去學習 OS 的經驗:

課本上總是說 OS 只對 process 作排程,像 pthread 這類的 user library 都是自行排程的,對 OS 來說還是只看到一個 process。所以還是沒辦法把 threads mapping 到不同的 physical/logical processors 吧!

所以我就認為,如果要讓這些用 pthread 寫的程式能把每一個 thread 都 mapping 到不同的 physical/logical processor,大概就只能用 OpenMP 了吧!

可是為了避免過於武斷,我把那個「聽說是」用 pthread 寫成的 ray-tracer 拿到一臺 SMP 的機器(2 顆 Xeon)上跑,發現這個 ray-tracer 的程式只佔據一個 logical processor 的資源(執行 top 時只看到 CPU(s) usage: 25% 因為我兩顆都有開 Hyper Threading),所以我就很篤定認為目前 pthread 還沒辦法利用不同的 logical processors。

直到有一天,我看著 OpenMP 的 user guide 看得有點無趣,便用 pthread 寫了一個程式跑跑,結果居然發現,我的程式居然把兩顆 CPU 的資源都搶來用了(加上HTT總共 4x logical processors)。後來又用 pthread 寫了一些小程式來實驗,發現至少從 Linux kernel 2.4.x 以後都能夠讓 pthread 利用不同的 logical processors。

所以現在我要作的是,去 figure out 為什麼那個程式沒有好好地用 pthread library 了。做研究還是不能夠太過武斷或是太相信課本。

  • 皮爾斯

    你好:

    可否請問你文中所說的完全利用所有processors的方法是怎麼做到的?

    謝謝

  • 這…Linux 2.4.x 以後的 kernel 直接拿 pthread 起來用就可以了啊 XD (至少當時我只實驗了 Linux 2.4.x)

  • kid

    linux 2.4.x之前的kernel是怎麼設計的 我不是很清楚
    不過以linuxthread 或 NPTL 這兩個thread libraries來說
    其實thread的create和process一樣都是透過clone這個system call
    所以嚴格說起來
    把linux的pthread當作user level thread其實怪怪的
    因為事實上是OS在排程唷