5

我想知道8個內核的硬件是否可以同時運行8個以上的線程。如果是這樣,使用openMP來並行化N個計算,我可以創建大小爲N/8的塊,並且在每個線程中進一步分成(N/8)/ 8個線程,甚至更多?多線程(openMP) - 多少個並行線程

當我嵌套並行化時會發生什麼?我仍然有8個可用線程用於嵌套並行嗎?

謝謝!

回答

10

8個內核在給定時間點最多隻能同時運行8個線程。然而,很大程度上取決於你的線程正在做什麼。如果他們正在執行CPU密集型任務,則不建議產生比核心數量更多的線程(有些可能還可以)。否則,過度的上下文切換和高速緩存未命中將開始降低性能。但是,如果存在重要的I/O,線程可能會被阻塞很多,而不是使用CPU,因此可以並行運行更多的線程。

底線是,您需要衡量您的特定情況下,在您的特定環境中的表現。請參閱this related thread

+0

我認爲交錯可能會在某些情況下加快速度?例如,如果有很多等待某些過程完成? – ScarletAmaranth 2012-04-16 17:06:47

+0

它看起來像我的程序更快(20%?)使用嵌套平行。我從來沒有強制要使用的線程數,我只設置了omp_set_nested(true) – octoback 2012-04-17 08:09:08

+0

@ScarletAmaranth,的確如此。 I/O是最典型的例子(因此我在我的回答中提到過),但也有其他情況。 – 2012-04-17 08:33:52

0

首先,你不能運行多於8個線程。 其次,如果沒有別的辦法可以使用嵌套並行機制,因爲openmp在這方面必須提高很多。

1

現代CPU處理器可以選擇超線程。
這意味着管道可以同時運行兩個或多個線程。

這樣可以同時運行的線程數是:
total_threads = num_procs *超線程因素

一般來說,超線程係數= 2

對於CPU密集型工作負載,你必須運行total_threads。 對於IO密集型工作負載,應該使用total_threads * 2個線程。這樣我們可以將某些線程的計算與其他線程的io重疊。

這些拇指規則是我所遵循的。你可以根據工作量來改變它。