AVX循环矢量化出错

时间:2016-03-04 15:24:59

标签: c++ memory-management vectorization intrinsics avx

当我尝试使用AVX获取数据时,我收到运行时错误 - 分段错误:

int i = 0;
const int sz = 9;
size_t *src1 = (size_t *)_mm_malloc(sz*sizeof(size_t), 32);
size_t *src2 = (size_t *)_mm_malloc(sz*sizeof(size_t), 32);
size_t *dst  = (size_t *)_mm_malloc(sz*sizeof(size_t), 32);


__m256 buffer  = _mm256_load_si256(&src1[i]);
__m256 buffer2 = _mm256_load_si256(&src2[i+1]); //Segmentation fault in this line

//Something...

_mm256_store_si256(dst[i], buffer);


_mm_free(src1);
_mm_free(src2);
_mm_free(dst);

我使用 ' _mm256_loadu_si256' 内在来解决问题。有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

_mm*_load_*内在函数仅适用于对齐数据,而_mm*_loadu_*内在函数允许您使用未对齐数据(性能损失) )。

分段错误告诉您,您尝试从内存加载到AVX寄存器的值未在正确的边界上对齐。对于256位版本,值必须在32字节边界上对齐。

如果您不想支付加载未对齐值的性能损失,那么您需要确保这些值在32字节边界上正确对齐。您可以通过插入填充或使用强制对齐的注释来执行此操作。注释是针对GCC的编译器特定的,你可以使用类似__attribute__((aligned(32)))的东西,而在MSVC上,你可以使用像__declspec(align(32))这样的东西。

问题 here ,但是,第二次加载时的数组索引正在强制来自未对齐内存位置的加载。这不能通过属性/注释来解决。你将不得不填补这些价值。使用size_t作为指针类型可能是第一个错误。该类型应为32字节宽。