2011-04-13 135 views
9

我在帶有Xeon處理器的Mac Pro上運行完全並行的矩陣乘法程序。我創建了8個線程(與內核一樣多的線程),並且沒有共享寫入問題(不寫入相同的位置)。出於某種原因,我使用pthread_createpthread_join大約是使用#pragma openmp的兩倍。爲什麼POSIX線程比OpenMP慢

有什麼都沒有其他的區別...相同的編譯選項,在這兩種情況下相同數目的線程,相同的代碼(除了編譯/ pthread部分明顯)等

而且環路非常大 - 我不是並行化小循環。

(我真的不能張貼代碼,因爲它是學校工作。)

爲什麼會這樣發生?不OpenMP使用POSIX線程本身?它怎麼會更快?

+0

它們是否都使用相同數量的累積CPU時間? – Gabe 2011-04-13 03:45:28

+1

您是否驗證過OpenMP與您的手動版本使用相同數量的線程? – Gabe 2011-04-13 03:49:15

+3

如果每個只使用7個線程會發生什麼? – Jess 2011-04-13 03:51:08

回答

6

(編輯) 你的主線程在做什麼?沒有看到你的代碼,我猜測主線程實際上幾乎沒有運行,但仍然在pthread結束時耗盡時鐘週期,然後重新開始並繼續。每次給定的週期都會暫停/繼續其他線程。

在OpenMP中,主線程可能會進入休眠狀態,並在並行區域結束時等待喚醒事件。

+1

嗯......這不完全是我的意思哈哈。我的意思是說有更多的線程比內核的數量多,所以他們爭奪處理時間。 (這裏的管理開銷可以忽略不計,因爲它絕對不會超過OpenMP *) – Mehrdad 2011-04-13 04:34:36

+2

在OpenMP中,初始線程(或在您的術語中是主線程)在工作共享區域與團隊的其他成員一起工作。除非沒有進一步的工作要做,否則這些線程都不會進入睡眠狀態(然後根據實現情況,線程會在睡眠或旋轉等待屏障)。 – ejd 2011-04-13 14:53:47

相關問題