SSE/SVML divrem系列intrinsics的mem_addr内存存储对齐要求咨询
关于divrem系列Intrinsic的内存对齐要求解答
核心结论
mem_addr指向的内存需要满足对应向量类型的对齐存储要求,具体规则:
- 对于
_mm_idivrem_epi32/_mm_udivrem_epi32(128位向量):需指向16字节对齐的内存,对齐要求等同于_mm_store_si128 - 对于
_mm256_idivrem_epi32/_mm256_udivrem_epi32(256位向量):需指向32字节对齐的内存,对齐要求等同于_mm256_store_si256
这些函数会直接将余数向量以对齐存储的方式写入目标内存,既不是未对齐存储(storeu类操作),也不会将余数通过寄存器返回——余数仅通过内存输出。
注意事项
- 若无法保证内存对齐,可通过以下方式处理:
- 堆内存:使用
_mm_malloc/_mm256_malloc分配对齐内存 - 栈内存:用
alignas(16)或alignas(32)修饰变量
- 堆内存:使用
- 传入未对齐指针时,部分不支持非对齐访问的CPU会触发异常,即使支持的CPU也会产生性能损耗
相关Intrinsic函数
__m128i _mm_idivrem_epi32 (__m128i * mem_addr, __m128i a, __m128i b) __m256i _mm256_idivrem_epi32 (__m256i * mem_addr, __m256i a, __m256i b) __m128i _mm_udivrem_epi32 (__m128i * mem_addr, __m128i a, __m128i b) __m256i _mm256_udivrem_epi32 (__m256i * mem_addr, __m256i a, __m256i b)
Intel官方说明
将a中的压缩32位整数除以b中的压缩元素,将截断结果存储到dst中,并将余数作为压缩32位整数存储到mem_addr指向的内存中。
伪代码逻辑
FOR j := 0 to 3 i := 32*j dst[i+31:i] := TRUNCATE(a[i+31:i] / b[i+31:i]) MEM[mem_addr+i+31:mem_addr+i] := REMAINDER(a[i+31:i] / b[i+31:i]) ENDFOR dst[MAX:128] := 0
内容的提问来源于stack exchange,提问作者scx
相关产品推荐
相关产品推荐

