2011-08-03 4 views
4

다른 정책을 기반으로 메모리를 할당하는 여러 가지 방법을 제공하는 여러 가지 맞춤 할당 기가 있습니다. 그 중 하나는 정의 된 NUMA 노드에 메모리를 할당합니다. 할당 자에 대한 인터페이스는 직선적이다NUMA 시스템에서 HWLOC를 사용하는 realloc()

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){} 
}; 

할당 자체 할당 정책 등 Howver, hwloc에서만 할당 및 free'ing 메모리 및 I 방법을 제공 대해 설정된 따른 파라미터로 hwloc_alloc_membind_nodeset() 방법을 사용하여 처리 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가 노드 5가 소유 한 메모리에서 realloc을 호출하면 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) 

귀속 노드 세트에서 NUMA 노드 (들) (ADDR 렌)에 의해 식별되는 이미 할당 메모리.

반환 값 : 액션이 EXDEV로 설정 errno를

  • -1
  • 을 지원하지 않는 경우 바인딩이

    에 시행 할 수없는 경우

    • -1, errno를 세트는 ENOSYS하기 이 호출은 mbind을 통해 구현됩니다. 영역의 페이지를 터치하지 않은 경우에만 작동하므로 두 번째 솔루션에서 메모리 영역을 이동하는 것이 더 정확한 방법입니다. UPDATE 터치 된 데이터를 이동하는 MPOL_MF_MOVE * 플래그가 있습니다.

      내가 아는 재 할당 및 복사하지 않고 페이지를 이동하는 유일한 콜은 move_pages

      move_pages 다른 NUMA 노드에 실행 프로세스의 주소 공간에있는 페이지 세트를 이동합니다.

    +0

    'hwloc_set_area_membind_nodeset'는'libnuma'에서'numa_realloc()'과 같은 것을 찾고있는 동안에 만 할당 된 메모리를 다른 노드로 옮길 수 있습니다. – grundprinzip

    1

    틀렸어. mbind는 접촉 된 페이지를 이동할 수 있습니다. MPOL_MF_MOVE를 추가하기 만하면됩니다. HWLOC_MEMBIND_MIGRATE 플래그를 추가하면 그 값은 hwloc_set_area_membind_nodeset()입니다.

    move_pages은 다른 방법으로 사용할 수 있습니다 (좀 더 유연하지만 독립적 인 페이지를 다른 위치로 이동할 수 있기 때문에 약간 느립니다). MPOL_MF_MOVE의 mbind와 move_pages (및 migrate_pages)는 입력을 페이지 목록으로 변환 한 후 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에 회신하려면 메모리 바인딩이 구체적이 아니고 가상 메모리 영역과 스레드 가능성이 있습니다. 특유한. realloc하면 libc는 특별한 일을하지 않습니다. 1) 동일한 페이지 내에서 다시 할당 할 수있는 경우 동일한 노드에서 메모리가 확보됩니다. 좋지만 희귀합니다. 특히 대형 버퍼의 경우. 2) 다른 페이지 (대용량 버퍼의 경우 대부분)에서 다시 할당되는 경우, 해당 페이지가 이전에 malloc lib에 의해 실제 메모리에 이미 할당되어 있는지 (malloc되고 가상 메모리에서 해제되었는지, 하지만 여전히 실제 메모리에 할당 됨) 2.a) 가상 페이지가 할당 된 경우 과거에 여러 가지 이유로 다른 노드에 할당되었을 수 있습니다. 2.b) 새 가상 페이지가 아직 할당되지 않은 경우 기본값은 현재 노드에 할당하는 것입니다. 이전에 set_area_membind() 또는 mbind()를 사용하여 바인딩을 지정한 경우 올바른 노드에 할당됩니다. 이 경우에 행복 할 수 있습니다.

    요컨대, 그것은 많은 것들에 달려 있습니다. 복잡한/숨겨진 내부 일을하는 malloc 라이브러리를 사용하고 싶지 않다면 (특히 버퍼가 큰 경우) malloc 대신 mmap (MAP_ANONYMOUS)을 사용하면 페이지가 실제로 필요할 때 할당된다는 간단한 방법입니다 그들. 그리고 realloc과 비슷한 것을하기 위해 mremap을했습니다.

    ALLOC mmap에 (세로) + set_area_membind realloc을가 mremap는 + set_area_membind (전체 mremap'ed 버퍼에)

    그 사용 없지만 재밌 절대하게된다.

    관련 문제