prosource

_mm_malloc을 사용하는 이유는 무엇입니까?( _aligned_memalign, alligned_alloc 또는 posix_memalign과는 반대)

probook 2023. 6. 17. 09:28
반응형

_mm_malloc을 사용하는 이유는 무엇입니까?( _aligned_memalign, alligned_alloc 또는 posix_memalign과는 반대)

정렬된 메모리 블록을 획득하는 데에는 몇 가지 옵션이 있지만 매우 유사하며 문제는 대부분 어떤 언어 표준과 플랫폼을 대상으로 하는지로 요약됩니다.

C11

void * aligned_alloc (size_t alignment, size_t size)

POSIX

int posix_memalign (void **memptr, size_t alignment, size_t size)

창문들

void * _aligned_malloc(size_t size, size_t alignment);

그리고 물론 손으로 정렬하는 것도 항상 선택할 수 있습니다.

Intel은 다른 옵션을 제공합니다.

인텔

void* _mm_malloc (int size, int align)
void _mm_free (void *p)

인텔에서 공개한 소스 코드에 따르면, 이것은 엔지니어들이 선호하는 정렬된 메모리를 할당하는 방법으로 보이지만 다른 방법과 비교한 문서를 찾을 수 없습니다.제가 찾은 가장 가까운 것은 다른 정렬된 메모리 할당 루틴이 존재한다는 것을 단순히 인정합니다.

https://software.intel.com/en-us/articles/memory-management-for-optimal-performance-on-intel-xeon-phi-coprocessor-alignment-and

정렬된 메모리를 동적으로 할당하려면 GCC와 Intel 컴파일러에서 지원하는 posix_memalign을 사용합니다.이것을 사용하면 메모리 폐기 API를 변경할 필요가 없다는 장점이 있습니다.항상 사용하는 것처럼 free()를 사용할 수 있습니다.그러나 매개변수 프로파일에 주의해야 합니다.

intposix_memalign (*memptr, size_t align, size_t size);

Intel 컴파일러는 다른 메모리 할당 API 세트도 제공합니다.C/C++ 프로그래머는 _mm_malloc 및 _mm_free를 사용하여 정렬된 메모리 블록을 할당하고 해제할 수 있습니다.예를 들어, 다음 명령문은 8개의 부동 소수점 요소에 대해 64바이트 정렬 메모리 블록을 요청합니다.

farray = (farray *)__mm_deloc(8*size of (farch), 64);

_mm_malloc을 사용하여 할당된 메모리는 _mm_free를 사용하여 해제해야 합니다._mm_malloc로 할당된 메모리에서 free를 호출하거나 malloc로 할당된 메모리에서 _mm_free를 호출하면 예측할 수 없는 동작이 발생합니다.

은 사자관서분차이점은한명의용점에▁that은▁the차점이▁perspectrences▁from▁user▁diffe▁clear사▁a▁is입니다._mm_malloc및 및 합니다. CPU 직 지 및 필 할 이_mm_malloc▁be다합니로 해제해야 합니다._mm_free단점을 할 때, 이한단을고때할려까무, 사하는이엇니입유는용러점들?▁를 사용하는 이유는 무엇입니까?_mm_malloc?약간의 성능 이점이 있을 수 있습니까?역사적 사고?

Intel 컴파일러는 POSIX(Linux) 및 비 POSIX(Windows) 운영 체제를 지원하므로 POSIX 또는 Windows 기능을 사용할 수 없습니다.따라서 컴파일러별이지만 OS에 구애받지 않는 솔루션이 선택되었습니다.

C11은 훌륭한 솔루션이지만 Microsoft는 아직 C99를 지원하지 않으므로 C11을 지원할지 여부를 알 수 없습니다.

업데이트: C11/POSIX/Windows 할당 기능과 달리 ICC 내장 기능에는 할당 해제 기능이 포함되어 있습니다.이를 통해 이 API는 기본 힙 관리자와 별도의 힙 관리자를 사용할 수 있습니다.실제로 그렇게 되는지는 모르겠지만 이 모델을 지원하는 데 유용할 수 있습니다.

고지 사항:저는 인텔에서 일하지만 입사하기 훨씬 전에 일어난 이러한 결정에 대해 특별한 지식은 없습니다.

는 식별자를 사용하지 않는 기존 C 할 수 _mm_alloc그리고._mm_free필요에 따라 동작하는 이름으로 함수를 정의합니다.이 작업은 다음과 같은 방법으로 수행할 수 있습니다._mm_alloc포지역하는을에서 을 함malloc() 1바이트인된 첫 해당 1이트인그안적정적처구 ▁having▁which바▁skipped▁the▁within,▁by구고▁to,하▁asks성▁or를터▁andations포▁immedi▁and이인▁for▁alloc▁construct-것대▁storing한▁pointer▁a▁from▁itoversized▁address▁suitably▁first▁of▁the▁numberaligned▁slightly▁a▁that▁address은▁bytes 그 주소 바로 앞에서 건너뛴 바이트 수를 저장하거나 다음과 같이 함으로써._mm_malloc에서 대용량 메모리 청크를 요청합니다.malloc()그런 다음 조각으로 나누어 줍니다.어쨌든, 포인터는 다음과 같이 반환됩니다._mm_malloc()는 지적이 되지 않을 것입니다.free()이든 할 줄; 일반적무할수든방있알법고을있을것다니입다전니는화; 합으로엇이다니▁would전▁calling화;;합▁generally▁with▁how▁to다._mm_free에 있는 바이트를 하여 에서 할받실시찾작위기을보한수할조다단로사당니바용합바에서 받은 합니다.malloc그런 다음 그것을 통과합니다.free.

에는 arigned-allocate 함수를 사용합니다.malloc그리고.free그러나 추가적인 포장 층의 필요성을 제거할 수 있는 기능.글을 쓰는 것은 가능합니다._mm_alloc()/_mm_free()▁를 감싸는 함수들malloc/free내부에 , 은 그의내대아알도못만지하지무다요, 그은을구니합것그것들부에해것▁that▁without다▁requires▁it니요▁but구._mm_alloc()가 사용하는 것과는 별개의 부기 정보를 보관합니다.malloc/free.

정렬 할당 함수의 작성자가 다음 방법을 알고 있는 경우malloc그리고.free하여 구된경우자, 모할당함조설수다유/의수있계니습정할를현든종종자▁so▁are▁that▁be/▁offree▁functions유다수있▁often▁design▁it니▁the▁theinate▁implement습수구▁all함,ed▁to▁coord▁possible,조현▁will정설이 되도록 할 수 있습니다.free모든 종류의 할당을 구분하고 적절하게 처리할 수 있습니다.에서 단일 정렬 할당 을 할 수 .malloc/free그러나 구현.

코드를 작성하는 가장 휴대하기 쉬운 방법은 아마도 자신의 할당과 자유 함수를 위해 다른 곳에서 사용되지 않는 두 개의 기호를 선택하는 것일 것이라고 제안합니다. 그러면 다음과 같이 말할 수 있습니다.

#define a_alloc(align,sz) _mm_alloc((align),(sz))
#define a_free(ptr)  _mm_free((ptr))

그것을 지원하는 컴파일러에서, 또는.

static inline void *aa_alloc(int align, int size)
{
  void *ret=0;
  posix_memalign(&ret, align, size); // Guessing here
  return ret;
}
#define a_alloc(align,sz) aa_alloc((align),(sz))
#define a_free(ptr)  free((ptr))

Posix 시스템 등에서.모든 시스템에서 필요한 동작을 생성하는 매크로 또는 함수를 정의할 수 있어야 합니다 [아마 매크로를 사용하는 것보다 일관되게 사용하는 것이 더 나을 것입니다.#if defined macroname아직 정의되지 않았는지 테스트합니다.

_mm_sysoc는 표준 aligned_alloc 함수가 존재하기 전에 생성된 것으로 보이며 _mm_free를 사용할 필요성이 구현의 특이점입니다.

제 생각에는 posix_memalign을 사용할 때와 달리 정렬을 보장하기 위해 과도하게 할당할 필요가 없고, 대신 별도의 정렬 인식 할당기를 사용합니다.이렇게 하면 기본 정렬(일반적으로 8바이트 또는 16바이트)과 다른 정렬 유형을 할당할 때 메모리가 절약됩니다.

언급URL : https://stackoverflow.com/questions/32612881/why-use-mm-malloc-as-opposed-to-aligned-malloc-alligned-alloc-or-posix-mem

반응형