当我尝试用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,或者&gt; = 13,则运行时不会崩溃。否则会发生分段错误。
怎么了?
编译器 - gcc 4.7。
答案 0 :(得分:2)
将对齐方式升高到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);
}