Странная ошибка в векторизации петли AVX

Когда я пытаюсь развернуть простейший цикл с AVX, я получаю ошибку времени выполнения — Ошибка сегментации:

    const int sz = 9;
float *src   = (float *)_mm_malloc(sz*sizeof(float), 16);
float *dest  = (float *)_mm_malloc(sz*sizeof(float), 16);

for(int i=0; i<8; i+=8)
{
__m256 buffer = _mm256_load_ps(src+i);
_mm256_store_ps(dest+i, buffer);
}

_mm_free(src);
_mm_free(dest);

Интересно: если С.З.= 8 или> = 13, время выполнения не разрушает. Иначе ошибка сегментации происходит.

В чем дело?

Компилятор — gcc 4.7.

3

Решение

Повышение выравнивания до 32 устраняет симптом.

Я не очень разбираюсь в этих особенностях, но я не удивлюсь, если 32-байтовое выравнивание требовалось на 64-битных процессорах

#include <mm_malloc.h>
#include <immintrin.h>

int main()
{
const int sz = 9;
float *src   = (float *)_mm_malloc(sz*sizeof(float), 32);
float *dest  = (float *)_mm_malloc(sz*sizeof(float), 32);

for(int i=0; i<8; i+=8)
{
__m256 buffer = _mm256_load_ps(src+i);
_mm256_store_ps(dest+i, buffer);
}

_mm_free(src);
_mm_free(dest);
}
2

Другие решения

Других решений пока нет …