Intel SSE Intrinsics _mm_load_si128 分段错误,

Posted

技术标签:

【中文标题】Intel SSE Intrinsics _mm_load_si128 分段错误,【英文标题】:Intel SSE Intrinsics _mm_load_si128 segmentation fault, 【发布时间】:2015-05-17 08:58:27 【问题描述】:

我目前正在使用 SSE 功能处理 5 x 5 矩阵。

我正在尝试将 x4 128 位整数值加载到 xmm 寄存器,如下所示,

#include <emmintrin.h>
#include <smmintrin.h>
//===================================== Initialising matrix

int* aligned_matrix;
posix_memalign((void **)&aligned_matrix, 16, sizeof(int) * 25);

for (ssize_t i = 0; i < 25; i++) 
    aligned_matrix[i] = 2; // uniform value of 2 assigned

return aligned_matrix;


//===================================== then, 

__m128i xmm8, xmm9; 

xmm8 = _mm_load_si128((__m128i *)(aligned_matrix)); // read 4 from first row

// this line below is where the segmentation fault occurs...
xmm9 = _mm_load_si128((__m128i *)(aligned_matrix + 5)); // 4 from next row

我有一种感觉,这可能与内存对齐或其他什么有关,但是......我无法指出我的问题所在......

我正在使用以下,

clang -msse -msse2 -msse4.1

*注意 - 我添加对齐矩阵 + 5 的原因是从 5x5 矩阵的第二行读取接下来的 4 个元素。

【问题讨论】:

【参考方案1】:

对于第二次加载,您需要使用_mm_loadu_si128,因为源数据未对齐。说明:从一个 16 字节对齐的基地址偏移 +5 个整数将不再是 16 字节对齐。

【讨论】:

这有什么关系?我在这里要做的就是读取第一行的前 4 个元素,然后移动到下一行并读取接下来的 4 个元素。为了进入下一行,我必须“aligned_matrix + 5”,因为它是 5 x 5 矩阵.. 哇,好用!多谢。顺便说一句,如果我使用非对齐负载,与对齐负载相比,会对性能产生负面影响吗? 在较旧的 CPU 上,是的,但在较新的 CPU 上,损失要小得多,但仍应尽可能避免。

以上是关于Intel SSE Intrinsics _mm_load_si128 分段错误,的主要内容,如果未能解决你的问题,请参考以下文章

SSE 内在函数检查零标志

Intel Intrinsics pack 命令误解

SSE (Intel) 到 NEON (ARM) 数据类型类似物

仅使用 SSE3 替换 _mm_cvtepi16_epi32

SSE 比较返回 NAN 向量

SSE 到霓虹灯 (_mm_movelh_ps)