很少使用的更快的整数 SSE 未对齐负载
A faster integer SSE unalligned load that's rarely used
我想了解更多关于 _mm_lddqu_si128
intrinsic(自 SSE3 以来的 lddqu
指令),特别是与 _mm_loadu_si128
intrinsic(自 SSE2 以来的 movdqu 指令)相比。
今天才发现_mm_lddqu_si128
。英特尔内在指南说
this intrinsic may perform better than _mm_loadu_si128 when the data crosses a cache line boundary
和a comment says它
will perform better under certain circumstances, but never perform worse.
那么为什么它没有被更多地使用(SSE3 是一个相当低的标准,因为所有 Core2 处理器都有它)?为什么当数据跨缓存线时它可能表现更好? lddqu
仅在特定处理器子集上可能更好。例如。在 Nehalem 之前?
我知道我可以通读 Intel 手册来找到答案,但我认为其他人可能会对这个问题感兴趣。
lddqu
used a different strategy than movdqu
在 P4 上,但在支持它的所有其他 CPU 上运行相同。没有特别的缺点(因为 SSE3 指令不占用任何额外的机器代码字节,并且此时甚至 AMD 也相当广泛地支持它),但除非您关心 P4,否则没有任何好处。
Dark Shikari(x264 视频编码器主要开发人员之一,负责大量 SSE 加速)went into detail about it in a blog post in 2008。这是一篇archive.orglink,因为原作已经下线,但他的博客里有很多好东西。
他提出的最有趣的一点是 Core2 仍然有缓慢的未对齐加载,其中手动执行两个对齐加载和 palignr
可以更快,但仅适用于立即移位计数。由于 Core2 运行 lddqu
与 movdqu
相同,因此没有帮助。
看来Core1确实专门实现了lddqu
,毕竟不是P4而已
关于 lddqu/movdqu 历史的 Intel blog post(我在 2 秒内用 google 找到了 lddqu vs movdqu
,/scold @Zboson)解释说:
(on P4 only):
The instruction works by
loading a 32-byte block aligned on a 16-byte boundary, extracting the 16 bytes corresponding to the unaligned
access.
Because the instruction loads more bytes than requested, some usage restrictions apply. Lddqu should
be avoided on Uncached (UC) and Write-Combining (USWC) memory regions. Also, by its implementation,
lddqu should be avoided in situations where store-load forwarding is expected.
所以我想这可以解释为什么他们不一直使用该策略来实施 movdqu
。
我想解码器没有可用的内存类型信息,那是必须决定将指令解码到哪个 uops 的时候。因此,尝试 "smart" 关于在 WB 内存上机会主义地使用更好的策略可能是不可能的,即使这是可取的。 (这不是因为商店转发)。
该博客的摘要post:
starting from Intel Core 2 brand (Core microarchitecture , from mid 2006, Merom CPU and higher) up to the future: lddqu does the same thing as movdqu
In the other words:
* if CPU supports Supplemental Streaming SIMD Extensions 3 (SSSE3) -> lddqu does the same thing as movdqu,
* If CPU doesn’t support SSSE3 but supports SSE3 -> go for lddqu
(and note that story about memory types )
我想了解更多关于 _mm_lddqu_si128
intrinsic(自 SSE3 以来的 lddqu
指令),特别是与 _mm_loadu_si128
intrinsic(自 SSE2 以来的 movdqu 指令)相比。
今天才发现_mm_lddqu_si128
。英特尔内在指南说
this intrinsic may perform better than _mm_loadu_si128 when the data crosses a cache line boundary
和a comment says它
will perform better under certain circumstances, but never perform worse.
那么为什么它没有被更多地使用(SSE3 是一个相当低的标准,因为所有 Core2 处理器都有它)?为什么当数据跨缓存线时它可能表现更好? lddqu
仅在特定处理器子集上可能更好。例如。在 Nehalem 之前?
我知道我可以通读 Intel 手册来找到答案,但我认为其他人可能会对这个问题感兴趣。
lddqu
used a different strategy than movdqu
在 P4 上,但在支持它的所有其他 CPU 上运行相同。没有特别的缺点(因为 SSE3 指令不占用任何额外的机器代码字节,并且此时甚至 AMD 也相当广泛地支持它),但除非您关心 P4,否则没有任何好处。
Dark Shikari(x264 视频编码器主要开发人员之一,负责大量 SSE 加速)went into detail about it in a blog post in 2008。这是一篇archive.orglink,因为原作已经下线,但他的博客里有很多好东西。
他提出的最有趣的一点是 Core2 仍然有缓慢的未对齐加载,其中手动执行两个对齐加载和 palignr
可以更快,但仅适用于立即移位计数。由于 Core2 运行 lddqu
与 movdqu
相同,因此没有帮助。
看来Core1确实专门实现了lddqu
,毕竟不是P4而已
关于 lddqu/movdqu 历史的 Intel blog post(我在 2 秒内用 google 找到了 lddqu vs movdqu
,/scold @Zboson)解释说:
(on P4 only): The instruction works by loading a 32-byte block aligned on a 16-byte boundary, extracting the 16 bytes corresponding to the unaligned access.
Because the instruction loads more bytes than requested, some usage restrictions apply. Lddqu should be avoided on Uncached (UC) and Write-Combining (USWC) memory regions. Also, by its implementation, lddqu should be avoided in situations where store-load forwarding is expected.
所以我想这可以解释为什么他们不一直使用该策略来实施 movdqu
。
我想解码器没有可用的内存类型信息,那是必须决定将指令解码到哪个 uops 的时候。因此,尝试 "smart" 关于在 WB 内存上机会主义地使用更好的策略可能是不可能的,即使这是可取的。 (这不是因为商店转发)。
该博客的摘要post:
starting from Intel Core 2 brand (Core microarchitecture , from mid 2006, Merom CPU and higher) up to the future: lddqu does the same thing as movdqu
In the other words:
* if CPU supports Supplemental Streaming SIMD Extensions 3 (SSSE3) -> lddqu does the same thing as movdqu,
* If CPU doesn’t support SSSE3 but supports SSE3 -> go for lddqu (and note that story about memory types )