Intel SSE Intrinsics _mm_load_si128 分段错误,
Intel SSE Intrinsics _mm_load_si128 segmentation fault,
我目前正在使用 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
*注意 - 我添加 aligned_matrix + 5 的原因是从 5x5 矩阵的第二行读取接下来的 4 个元素。
对于第二次加载,您需要使用 _mm_loadu_si128
,因为源数据未对齐。解释:从 16 字节对齐的基地址偏移 +5 整数将不再是 16 字节对齐。
我目前正在使用 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
*注意 - 我添加 aligned_matrix + 5 的原因是从 5x5 矩阵的第二行读取接下来的 4 个元素。
对于第二次加载,您需要使用 _mm_loadu_si128
,因为源数据未对齐。解释:从 16 字节对齐的基地址偏移 +5 整数将不再是 16 字节对齐。