如何确定我的处理器有多少个 AVX 寄存器?
How can I determine how many AVX registers my processor has?
目前我正在开发使用 AVX 寄存器计算积分的函数。我想知道我的计算机上是否有足够的它们。我怎样才能知道?
假设 CPU 完全使用 AVX(即不是 Pentium/Celeron,即使是最新一代):
32 位模式总是有 8 个架构 YMM 寄存器。 32 位模式对于高性能计算来说已经过时了。
64 位模式有 16 个 YMM regs,如果使用 AVX512VL,则有 32 个 YMM regs,如果你使用 EVEX 编码的 256 位版本的指令。
在任何一种情况下,它们都被重命名到更大的物理寄存器文件 (PRF) 上,避免了先写后写和先读后写的危险。 https://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ 有一些关于乱序执行的信息 window 大小受 PRF 大小限制,而不是受重新排序缓冲区 (ROB) 限制。
您可以在大多数编译器上使用 #if defined(__x86_64__)
检测 64 位模式,在 MSVC 上使用 #if defined(_M_X64)
。
AVX 的编译时检测是 __AVX__
,AVX512VL 是 __AVX512VL__
。 (带有 AVX512 的主流 CPU 有它,Xeon Phi (KNL / KNM) 没有;只有遗留 SSE 或 AVX512 全宽 ZMM。)您可能只想对 AVX 进行运行时检测,而不是将其启用为不过,所有源文件的基线。
目前我正在开发使用 AVX 寄存器计算积分的函数。我想知道我的计算机上是否有足够的它们。我怎样才能知道?
假设 CPU 完全使用 AVX(即不是 Pentium/Celeron,即使是最新一代):
32 位模式总是有 8 个架构 YMM 寄存器。 32 位模式对于高性能计算来说已经过时了。
64 位模式有 16 个 YMM regs,如果使用 AVX512VL,则有 32 个 YMM regs,如果你使用 EVEX 编码的 256 位版本的指令。
在任何一种情况下,它们都被重命名到更大的物理寄存器文件 (PRF) 上,避免了先写后写和先读后写的危险。 https://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ 有一些关于乱序执行的信息 window 大小受 PRF 大小限制,而不是受重新排序缓冲区 (ROB) 限制。
您可以在大多数编译器上使用 #if defined(__x86_64__)
检测 64 位模式,在 MSVC 上使用 #if defined(_M_X64)
。
AVX 的编译时检测是 __AVX__
,AVX512VL 是 __AVX512VL__
。 (带有 AVX512 的主流 CPU 有它,Xeon Phi (KNL / KNM) 没有;只有遗留 SSE 或 AVX512 全宽 ZMM。)您可能只想对 AVX 进行运行时检测,而不是将其启用为不过,所有源文件的基线。