gpt4 book ai didi

c++ - 使用 AVX 寄存器 union 类成员以减少内存访问?

转载 作者:行者123 更新时间:2023-11-30 02:36:40 25 4
gpt4 key购买 nike

如果我有一个包含指针、 float 、 double 、int32 和 int16 的混合类(或结构),我能否将该类与 AVX 寄存器 union ,然后通过 union 访问数据以强制编译器加载数据都在一起?

我正在尝试减少内存负载。

最佳答案

你可以做到,而且它会起作用(如果 struct 足够小),但最终不会更快。除非您只想将整个结构复制为 32 字节的 block 。

如果您分别加载所有成员,那么您会在汇编中看到许多加载指令,例如 mov eax, [esi + 10h]。看来您想减少这些指令的数量。

您确实可以将它们加载为 __m256 类型的一个 AVX 值,然后您将只看到一条指令,如 vmovaps ymm0, [esi]。但是,该加载的结果将在 256 位 YMM 寄存器中。您将无法免费访问此寄存器的部分内容。

XMM 和 YMM 寄存器主要充当大数据 block ,您可以轻松地对 32 位整数进行 8 宽加法,但您无法快速访问这些 256 位 block 的任意部分。您仍然可以尝试提取 YMM 寄存器的一部分,但它需要额外的指令(至少与标量版本中的 mov-s 一样多),因此生成的代码会更慢。

如果你真的想提取部分 AVX 寄存器,请务必在你的结构上使用 #pragma pack 并手动对齐其数据成员,否则成员的偏移量可能因编译器和位数。

您可能关心的另一件事是实际内存事务的数量。您可能认为一个 256 位加载比许多单独的 32 位和 16 位加载更快。在我看来,这是不正确的:内存是在缓存行粒度上运行的。每个 64 字节的内存块都是一个缓存行,处理器只能加载整个缓存行。在这两种情况下,将加载相同数量的缓存行,因此内存访问不会变得更快。

关于c++ - 使用 AVX 寄存器 union 类成员以减少内存访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32462762/

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