다음과 같은 질문은 답변이 오래된 그러나, 관련 및 사용자의 코멘트 마크 Glisse은 충분히 논의되지 않을 수 있습니다이 문제에 대한 17 ++ C 이후 새로운 접근 방식이 있습니다 제안합니다.
SIMD에 대해 정렬 된 메모리가 올바르게 작동하면서 여전히 모든 데이터에 액세스하려고합니다.
Intel에서 유형의 float 벡터를 만들고 __m256
크기를 8 배 줄이면 정렬 된 메모리가 제공됩니다.
예 : std::vector<__m256> mvec_a((N*M)/8);
약간 해킹 된 방식으로 벡터 요소에 대한 포인터를 플로팅하여 개별 플로트 값에 액세스 할 수 있습니다.
대신, std::vector<float>
올바르게 정렬 된 것을 선호 하므로 __m256
segfaulting없이 다른 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를 사전에 필요하지 않은 경우에만 구현해야 할당 () 및 할당 해제 () 를의, 방법.