存储SSE操作结果时的对齐要求
alignment requirements when storing the result of SSE operations
考虑使用英特尔SSE内部函数的代码片段,如下所示:
void foo(double* in1ptr, double* in2ptr)
{
double result[8];
/* .. stuff .. */
__m128d in1 = _mm_loadu_pd(in1ptr);
__m128d in2 = _mm_loadu_pd(in2ptr);
__m128d* resptr = (__m128d*)(&result[4]); <----------
*resptr = __mm_add_pd(in1,in2);
/* .. stuff .. */
}
在指示的行中-当声明resptr
指向结果数组内索引4的位置时-
1) 这在gcc
中有效,但这是正确的做事方式吗?
2) 这里的对齐期望是什么?我可以创建指向任意内存位置的resptr
指针,然后在该内存位置存储SSE操作的结果吗?
load/store内部函数的存在是为了向编译器传达对齐保证或缺少对齐保证。如果您的数据是16B对齐或32B对齐的,则不需要它们。
仅转换为(__m128d*)
遵循通常的C语义,即暗示__m128d
具有足够的对齐。(编译器使用movapd
而不是movupd
,如果地址不对齐,则会在运行时出错)。
在这种情况下,您没有采取任何措施来确保对齐。幸运的是,你的本地数组是16B对齐的。如果您使用alignas(16) double result[8];
,该代码将是安全的。
对于未对齐的存储,请使用_mm_storeu_pd
。另请参阅x86标记wiki。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 三维矢量的SSE对齐
- 像“float[10][10]”初始化的数组是否已经针对 SIMD/SSE 进行了内存对齐
- SSE 向量的对齐和未对齐加载和存储 - 如何减少代码重复
- 存储SSE操作结果时的对齐要求
- 对齐、总尺寸和SSE
- 动态分配的内存在 SSE 中未对齐
- 使用带有自定义对齐分配器实现的最新g++,使用SSE和-O3选项编译时出现非法指令(核心转储)
- 正在对齐SSE的模板矢量结构
- 如何对齐结构数组,每个结构都需要对齐(SSE)
- 在托管代码中调用SSE代码(对齐)
- C++中SSE的内存对齐,_aligned_malloc等效
- 随机存取与SSE对齐的存储器