2011-08-03 44 views
4

NUMA系統我有一個提供不同的裝置根據不同的策略來分配內存中的幾個自定義的分配。其中一個在定義的NUMA節點上分配內存。到分配器的接口是直截了當realloc()的使用HWLOC

template<typename config> 
class NumaNodeStrategy 
{ 

public: 

    static void *allocate(const size_t sz){} 

    static void *reallocate(void *old, size_t sz, size_t old_sz){} 

    static void deallocate(void *p, size_t sz){} 
}; 

分配本身是使用hwloc_alloc_membind_nodeset()方法有用於分配策略等Howver,hwloc僅提供分配和free'ing存儲器和I的方法設置的參數,根據處理想知道我應該如何實施reallocate()

兩個可能的解決方案:

  1. 分配新的內存區域和memcpy()數據
  2. 使用hwloc_set_membind_nodeset()設置內存分配/結合政策的節點集,並使用純malloc()/posix_memalign()realloc()

誰能幫助我得到這個吧?

更新:

我努力使這個問題更具體:是否有執行可能性realloc()使用hwloc不分配新的內存,並四處移動網頁?

+0

直接使用libnuma怎麼樣? http://linux.die.net/man/3/numa – osgx

+0

因爲'libnuma'可能會產生錯誤的結果(顯示numa節點等錯誤的cpu綁定),我希望使用'hwloc'代替。 https://gist.github.com/1125022 – grundprinzip

+0

嗯..是內存綁定設置節點特定的?那麼,如果節點5調用內存中的realloc(由節點5擁有),libc的realloc會執行同節點內存分配嗎? – osgx

回答

1

hwloc_set_area_membind_nodeset的伎倆,不是嗎?

HWLOC_DECLSPEC int  
    hwloc_set_area_membind_nodeset (hwloc_topology_t topology, 
    const void *addr, size_t len, hwloc_const_nodeset_t nodeset, 
    hwloc_membind_policy_t policy, int flags) 

綁定由(ADDR,LEN)鑑定爲在節點集的NUMA節點(一個或多個)的已分配的內存。

返回:

  • -1並將errno設置爲ENOSYS如果動作不支持
  • -1,並將errno設置爲EXDEV如果綁定無法執行

在Linux中,此呼叫經由mbind實現它的工作原理只有在區域頁面並沒有被感動,所以它是你的第二個解決方案移動存儲區域只是比較正確的做法。 更新有一個MPOL_MF_MOVE *標誌移動觸摸的數據。

移動頁面,而不再分配和複製我所知道的唯一的系統調用是move_pages

move_pages移動一組在運行進程的地址空間的頁面爲不同的NUMA節點。

+0

正如你所說的'hwloc_set_area_membind_nodeset'只允許將分配的內存移動到另一個節點,而我在'libnuma'中尋找類似'numa_realloc()'的東西。 – grundprinzip

1

你錯了。 mbind可以移動已被觸摸的頁面。你只需要添加MPOL_MF_MOVE。這就是hwloc_set_area_membind_nodeset()如果你添加標誌HWLOC_MEMBIND_MIGRATE

move_pages只是一個不同的方式來做到這一點(更靈活,但有點慢,因爲你可以將獨立頁面移動到不同的地方)。與MPOL_MF_MOVE和move_pages(以及migrate_pages)的mbind最後在mm/migrate.c中使用完全相同的migrate_pages()函數,一旦它們將輸入轉換爲頁面列表。

+0

因此,grundprinzip可以做一個通常的realloc,然後用'HWLOC_MEMBIND_MIGRATE'調用'hwloc_set_area_membind_nodeset()'? – osgx

+1

是的。 或者他也可以執行hwloc_alloc_membind_nodeset()來在正確的內存節點上分配新的緩衝區,然後手動將memcpy從舊的緩衝區移動到新的緩衝區,然後釋放舊的緩衝區。無論如何,你必須複製一些內容,所以最好在綁定最終緩衝區後進行復制。 – Brice

+0

我知道可以遷移頁面,但正如問題中所述,我想增加分配的內存區域,並希望避免複製。 – grundprinzip

2

要回復編輯: hwloc中沒有realloc,我們目前沒有計劃添加一個。如果你首先看到你想要的東西(C函數的原型),隨時添加一張票https://svn.open-mpi.org/trac/hwloc

回覆ogsx:內存綁定不是特定的,它是虛擬內存區域特定的,具體。如果你重新分配,libc不會做任何特殊的事情。 1)如果它可以在同一頁面內重新分配,則在同一節點上獲得內存。好,但很少見,特別是對於大型緩衝區。 2)如果它重新分配在一個不同的頁面(大多數情況下是大緩衝區),它取決於相應的頁面是否已經被malloc lib在物理內存中分配過了(malloc在virtual memory中被釋放,但仍然分配在物理內存中) 2.a)如果已經分配了虛擬頁面,則可能由於各種原因在另一個節點上分配了虛擬頁面。 2.b)如果尚未分配新的虛擬頁面,則默認爲在當前節點上分配。如果您先前使用set_area_membind()或mbind()指定了綁定,它將分配到正確的節點上。在這種情況下你可能會很高興。

總之,這取決於很多事情。如果你不想用malloc lib做複雜/隱藏的內部事情,特別是如果你的緩衝區很大,做mmap(MAP_ANONYMOUS)而不是malloc是一種簡單的方法,以確保在你真正想要的時候分配頁面他們。你甚至有mremap做類似於realloc的東西。

ALLOC變得MMAP(長度)+ set_area_membind realloc的變mremap + set_area_membind(對整個mremap'ed緩衝器)

從未使用過,但看起來有趣。