[c++] std :: vector를 만드는 현대적인 접근 방식으로 정렬 된 메모리 할당

다음과 같은 질문은 답변이 오래된 그러나, 관련 및 사용자의 코멘트 마크 Glisse은 충분히 논의되지 않을 수 있습니다이 문제에 대한 17 ++ C 이후 새로운 접근 방식이 있습니다 제안합니다.

SIMD에 대해 정렬 된 메모리가 올바르게 작동하면서 여전히 모든 데이터에 액세스하려고합니다.

Intel에서 유형의 float 벡터를 만들고 __m256크기를 8 배 줄이면 정렬 된 메모리가 제공됩니다.

예 : std::vector<__m256> mvec_a((N*M)/8);

약간 해킹 된 방식으로 벡터 요소에 대한 포인터를 플로팅하여 개별 플로트 값에 액세스 할 수 있습니다.

대신, std::vector<float>올바르게 정렬 된 것을 선호 하므로 __m256segfaulting없이 다른 SIMD 유형에 로드 할 수 있습니다 .

Align_alloc을 살펴 보았습니다 .

이것은 올바르게 정렬 된 C 스타일 배열을 제공 할 수 있습니다.

auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));

그러나에 대한 방법을 잘 모르겠습니다 std::vector<float>. 의 std::vector<float>소유권을 부여하는 marr_a 것은 가능하지 않은 것 같습니다 .

커스텀 할당자를 작성해야한다는 제안을 보았지만 많은 작업처럼 보이며 현대 C ++에서 더 나은 방법이 있습니까?



답변

벡터를 포함한 표준 C ++ 라이브러리의 모든 컨테이너 에는 컨테이너의 할당자를 지정 하는 선택적 템플릿 매개 변수 있으며 실제로는 자신 의 컨테이너 를 구현하는 데 많은 작업이 필요하지 않습니다.

class my_awesome_allocator {
};

std::vector<float, my_awesome_allocator> awesomely_allocated_vector;

할당자를 구현하는 약간의 코드를 작성해야하지만 이미 작성한 것보다 더 많은 코드는 아닙니다. 당신 ++ 17 지원-C를 사전에 필요하지 않은 경우에만 구현해야 할당 ()할당 해제 () 를의, 방법.


답변