首页 > 解决方案 > 数组操作向量化期间的分段错误

问题描述

我有一个长度为 32 的输入数组,精度为 16 位。

考虑,

__attribute__ ((aligned(32))) short inp[32] = {-1, -2, -3, -4, -5, -6, -7, -8, 9, 10, 11, 12, 13, 14, 15, 16, -17, -18, -19, -20, -21, -22, -23, -24, 25, 26, 27, 28, 29, 30, 31, 32};
short res[8];

我必须表演,

res = min(inp(0:7), inp(8:15));

为此,我尝试了下面附上的一些东西,

// Method 1
__m256i* avxinp0 = (__m256i*) inp;
__m256i* avxinp1 = (__m256i*) (inp+8);
__m256i avxres = _mm256_min_epi16(*avxinp0, *avxinp1);
memcpy(res, (short*)avxres, 8*sizeof(short));

// Method 2
__m256i* avxinp0 = (__m256i*) inp0;
__m256i* avxinp1 = (__m256i*) (inp0+8);
__m256i mem0;
_mm256_store_si256(&mem0, *avxinp1);
__m256i avxres = _mm256_min_epi16(*avxinp0, mem0);
memcpy(res, (short*)avxres, 8*sizeof(short));

两者都在编译时出现分段错误。GCC是用来编译的。这是什么原因呢?有什么方法可以矢量化它吗?

标签: cx86simdavxavx2

解决方案


推荐阅读