【发布时间】:2020-10-06 16:43:33
【问题描述】:
目前我正在开发使用 AVX 寄存器计算积分的函数。我想知道我的计算机上是否有足够的它们。我怎样才能知道呢?
【问题讨论】:
-
您想专门为您的计算机或任何计算机(在运行时或编译时)确定它吗?
标签: c++ cpu-registers avx
目前我正在开发使用 AVX 寄存器计算积分的函数。我想知道我的计算机上是否有足够的它们。我怎样才能知道呢?
【问题讨论】:
标签: c++ cpu-registers avx
假设 CPU 完全带有 AVX(即不是 Pentium/Celeron,甚至是最新一代):
32 位模式始终有 8 个架构 YMM 寄存器。对于高性能计算来说,32 位模式已经过时了。
64 位模式有 16 个 YMM regs,如果使用 EVEX 编码的 256 位版本的指令,则 AVX512VL 有 32 个。
在任何一种情况下,它们都会被重命名为更大的物理寄存器文件 (PRF),从而避免写后写和读后写危险。 https://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ 有一些关于无序执行窗口大小受 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 进行运行时检测,而不是将其作为所有您的基线不过,源文件。
【讨论】:
-march=native 编译,则不会。但是,是的,全面启用 AVX 并不是每个人都想做的事情。我在回答中将 x86-64 检测与 AVX 检测分开。