다음과 같은 질문은 답변이 오래된 그러나, 관련 및 사용자의 코멘트 마크 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 ++에서 더 나은 방법이 있습니까?
_mm256_loadu_ps(&vec[i])
. 기본 튜닝 옵션, GCC는 참고 있지만 ( 분할 256 비트로드 / 저장 - 보장되지 정렬 vmovups XMM / vinsertf128에. 그래서이 있습니다 사용하는 장점_mm256_load
을 통해loadu
당신이 걱정하는 경우 어떻게 GCC에 코드를 컴파일 누군가 잊어 경우에 사용-mtune=...
또는-march=
옵션.)