gpt4 book ai didi

c - 哪个更快?

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:37 25 4
gpt4 key购买 nike

我在 gcc 4.4.3 中使用 SSE2。在我的程序中,我需要至少使用 128 位 SIMD 寄存器的 (0 - 7) 8 位。请建议我可以快速检索 8 位的方法。

我尝试使用 _mm_movepi64_pi64_mm_extract_epi16,它们在我的程序中提供了相似的性能。我也在尝试使用 union 方法。 union{__m128i a1, int a2[4]}。虽然在测试用例中,它给出了很好的结果,但在我的程序中,这种方法不是很好。

任何想法..(我应该使用上述三种方式中的哪一种?)

最佳答案

_mm_movepi64_pi64 从 XMM 寄存器移动到 MMX 寄存器。这不可能是正确的选择,除非您想在 MMX 寄存器中执行更多 SIMD,并且您的代码用完了 XMM 寄存器。

如果您希望这些位作为数组索引或其他内容,它们必须位于 GP 寄存器中,在这种情况下您需要 SSE4.1 _mm_extract_epi8

如果您需要坚持使用 SSE2,这应该是获取 xmm0 字节 5 的最快方法:

pextrw eax, xmm0, 2
movzx eax, ah

所以这应该有望让编译器像那样高效:

(uint8_t)(_mm_extract_epi16(var, n/2) >> ((n%2) * 8))

效率较低的是按字节移位 _mm_bsrli_si128 (psrldq) 将您想要的字节放入 xmm reg 的低字节,然后 movd(幸运的是,_mm_extract_epi16(var, 0) 发出 movd,而不是 pextrw r32, xmm, 0)。这样,如果您想要的字节是 pextw 将留在结果的高 8 位的奇数字节,则您无需执行任何额外操作。仍然没有简单的方法将它与不是编译时常量的索引一起使用。

存16B到内存,加载你想要的元素应该还算不错吧。 ( union 方法可能会得到什么,除非编译器将其优化为 pextract 指令)。编译器将使用堆栈上的 16B 对齐位置。因此,store->load forwarding 在这种情况下应该可以正常工作,因此延迟会很低。如果您需要将两个单独的元素放入两个单独的整数变量中,这可能是最佳选择,也许会击败多个 pextrw

关于c - 哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com