如果某个程序包含所讨论的 cpu 不支持的某些指令,会发生什么情况?
What happens to a program that contains certain instructions that are not supported by the cpu in question?
例如,在 x86-64 的情况下,您有一个使用 avx-512 指令或任何其他特殊用途指令的程序,并且所讨论的 cpu 不支持该指令低级别,例如基于 haswell 的 cpu,这种情况如何解决?
程序只是不能 运行(我的第一个想法)还是有办法让 cpu 仍然 运行 使用它确实支持的指令的程序,但是它根本不会获得相关指令提供的性能优势?
如果程序检查 CPU 功能并实际上避免了 运行 不受支持的指令,那么您只会错过性能。像 x264 和 x265 这样的库就是这样做的,当它们开始指向最受支持的函数版本时设置函数指针 CPU。
如果您执行 运行 一条不受支持的指令(例如,因为您使用 gcc -O3 -march=skylake-avx512
编译以告诉编译器它可以假定支持 AVX-512),则有 2 种可能性:
- 它恰好解码为其他东西(AVX-512 不会是这种情况,但确实会发生,例如
lzcnt
解码为 bsr
)。
- CPU 引发#UD 异常(未定义指令)。 OS 处理它并向进程传递一个 SIGILL(非法指令),或者在非 POSIX OSes 上等效于 Windows.
例如,在 x86-64 的情况下,您有一个使用 avx-512 指令或任何其他特殊用途指令的程序,并且所讨论的 cpu 不支持该指令低级别,例如基于 haswell 的 cpu,这种情况如何解决?
程序只是不能 运行(我的第一个想法)还是有办法让 cpu 仍然 运行 使用它确实支持的指令的程序,但是它根本不会获得相关指令提供的性能优势?
如果程序检查 CPU 功能并实际上避免了 运行 不受支持的指令,那么您只会错过性能。像 x264 和 x265 这样的库就是这样做的,当它们开始指向最受支持的函数版本时设置函数指针 CPU。
如果您执行 运行 一条不受支持的指令(例如,因为您使用 gcc -O3 -march=skylake-avx512
编译以告诉编译器它可以假定支持 AVX-512),则有 2 种可能性:
- 它恰好解码为其他东西(AVX-512 不会是这种情况,但确实会发生,例如
lzcnt
解码为bsr
)。 - CPU 引发#UD 异常(未定义指令)。 OS 处理它并向进程传递一个 SIGILL(非法指令),或者在非 POSIX OSes 上等效于 Windows.