AVX循环矢量化中的奇怪错误

Strange error in AVX loop vectorization

本文关键字:错误 循环 矢量化 AVX      更新时间:2023-10-16

当我尝试用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);

有趣的是:如果sz=8或>=13,运行时不会崩溃。否则会出现分段错误

怎么了?

编译器-gcc 4.7。

将对齐提高到32会使症状消失。

我不太熟悉这些本质,但如果在64位CPU 上需要32字节对齐,我不会感到惊讶

#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);
}