2011-03-29 47 views
7

雖然我試圖提高非NUMA /標準PC上應用程序的速度,但我始終發現,瓶頸是對malloc()的呼籲,因爲即使在多核計算機中,它也是在所有核心之間共享/同步的。做malloc/memcpy函數在NUMA上獨立運行嗎?

我有使用Linux和C和NUMA架構提供一臺PC,我有兩個問題:

  1. 在NUMA機器,因爲每個核心都設置有其自己的內存,將malloc()每個核心獨立執行/內存沒有阻塞其他內核?
  2. 在這些體系結構中,如何調用memcpy()?這可以在每個內核上獨立調用,或者一旦內核阻塞其他內核,就可以調用它。我可能錯了,但我記得memcpy()也得到了malloc()的同樣的問題,即當一個內核正在使用它時,其他人必須等待。

回答

4

NUMA機器是一個共享內存系統,所以來自任何處理器的內存訪問都可以不受阻塞地訪問內存。如果內存模型是基於消息的,則訪問遠程內存將需要執行處理器請求本地處理器執行期望的操作。但是,在NUMA系統中,由於使用了內存鏈接,遠程處理器仍可能會影響關閉處理器的性能,但這可能取決於特定的體系結構配置。

至於1,這完全取決於OS和malloc庫。操作系統負責將每個內核/每個處理器的內存顯示爲統一空間或NUMA。 Malloc可能或不可能是NUMA意識的。但從根本上講,malloc實現可能會或可能不會與其他請求同時執行。 Al(以及相關討論)的答案更詳細地闡述了這一點。

至於2中,作爲memcpy的由一系列的加載和存儲的,唯一的影響將再次使用其他處理器的存儲器控​​制器的潛在建築效果等

+0

嗨,布賴恩。非常感謝。你知道任何NUMA知道的malloc庫嗎?我搜索了一下,我發現MPC ...在你看來這很好嗎? – 2011-03-29 17:04:36

+0

在我寫作NUMA知道的東西的罕見時候,我使用VirtualAllocExNuma(Windows)或libnuma(linux)直接從操作系統分配內存。 – Brian 2011-03-30 03:11:25

+0

非常感謝,我會試一試。 – 2011-03-30 14:20:39

2
  1. 不管您是否在NUMA體系結構中,在獨立進程中調用malloc都將獨立執行。在同一進程的不同線程中調用malloc不能獨立執行,因爲返回的內存對進程內的所有線程均可訪問。如果您需要特定線程本地的內存,請閱讀線程本地存儲。我一直無法找到有關Linux VM和調度程序是否能夠優化內核,線程,本地內存和線程本地存儲之間的相關性的明確文檔。
+0

「調用在不同的線程對malloc同樣的過程不能獨立執行「 - 在非NUMA上,他們可以使用每線程內存池,儘管在不同線程中調用」free「可能不是獨立的,因爲當然你可以從不同的線程中釋放內存你分配它。 – 2011-03-29 11:39:23

+0

但這完全取決於malloc的實現。人們通常使用3. party malloc庫(例如tcmalloc)來提高多線程應用程序的性能(儘管tcmalloc和glibc malloc都不考慮NUMA) – nos 2011-03-29 14:10:16

+0

您好Steve。據我所知,內存池只是不斷釋放的內存塊,不會被釋放(至少這是我們在非NUMA體系結構中使用的方式)。在我看來,你提出的更多的解決方案是基於某個庫做兩件事的解決方案:A =創建一個每線程內存池B =重新定義malloc行爲。我是正確的還是在操作系統級別爲這種硬件指定的東西? – 2011-03-29 15:11:30