You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:47