loadu和load之间有什么区别?

Opa*_*pal 0 x86 assembly sse simd intrinsics

什么更有效,为什么?

具体地_mm_loadu_si128_mm_load_si128在C.

(编者注:或者这是标记的程序集,可能它们意味着movdqumovdqa手写的asm.这是一样的,特别是没有AVX,因为_mm_load_si128可以编译成ALU指令的内存操作数而根本没有单独movdqa的.)

Pau*_*l R 7

loadu用于未对齐的加载(来自未对齐到16字节倍数的地址),load用于对齐的加载.如果您知道源地址已正确对齐,那么load通常会更高效,因为它只需要一个读取周期,而不必处理修复多个未对齐数据块.在较旧的Intel CPU上,未对齐负载的性能损失非常大(通常> 2x),但在最近的CPU(例如Core i5/i7)上,惩罚几乎可以忽略不计.请注意,loadu除了上述性能损失之外,使用对齐数据是正常的,但使用load未对齐的数据将产生异常(即崩溃).

  • OP现已澄清 - 它是x86/SSE (2认同)
  • 你能否(或者你知道任何可以来源的资料)量化"微不足道"的惩罚有多小?[这篇英特尔文章](https://software.intel.com/en-us/articles/practical-intel-avx-optimization-on-2nd-generation-intel-core-processors)表示"有更多的退化使用未对齐的数据并在某些特定情况下使用`loadu`和`storeu`指令"时超过20%. (2认同)