以下代码是否有效以检查CPU是否支持SSE3指令集?
使用该IsProcessorFeaturePresent()功能显然不适用于Windows XP(请参阅http://msdn.microsoft.com/en-us/library/ms724482(v=vs.85).aspx).
bool CheckSSE3()
{
int CPUInfo[4] = {-1};
//-- Get number of valid info ids
__cpuid(CPUInfo, 0);
int nIds = CPUInfo[0];
//-- Get info for id "1"
if (nIds >= 1)
{
__cpuid(CPUInfo, 1);
bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false;
return bSSE3NewInstructions;
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 有趣的是它在游戏和其他软件中的工作原理。
更准确地说,我正在寻求一个解决方案C++。
就像是:
if AMX available -> Use AMX version of the math library
else if AVX-512 available -> Use AVX-512 version of the math library
else if AVX-256 available -> Use AVX-256 version of the math library
etc.
Run Code Online (Sandbox Code Playgroud)
我的基本想法是在不同的 DLL 中编译库并在运行时交换它们,但这对我来说似乎不是最好的解决方案。
到目前为止,我已经设法找到:
有关在Windows上使用SSE3,SSSE3,SSE4.1,SSE 4.2,AVX2和AVX-512的注意事项吗?
一些澄清:如果我使用其中一个SSE/AVX集合的指令,我需要这个来确定我的程序运行的操作系统.
或者更具体地说,我如何确保/ proc/cpuinfo和CPUID操作码不显示AVX已启用?
(对于上下文,某些Amazon EC2实例上存在一个错误,其中AVX被错误地报告为活动状态,导致动态使用AVX指令的程序与SIGILL崩溃).
我已经看过这个内核补丁:https://patchwork.kernel.org/patch/1521191/,但我不确定这是否会影响内核的avx使用情况,还是补丁CPUID和/ proc/cpuinfo.无论如何,我希望找到适用于Linux 2.6.x内核系列的解决方案.
我们用 编译我们的代码g++ -march=ivybridge -mtune=skylake。如果有人在较旧/不兼容的架构上运行,我希望应用程序能够优雅地通知并退出。我该怎么做呢?AMD处理器怎么样?是否存在某种同等的架构/指令?
我测试了以下简单的功能
void mul(double *a, double *b) {
for (int i = 0; i<N; i++) a[i] *= b[i];
}
Run Code Online (Sandbox Code Playgroud)
具有非常大的数组,因此它受内存带宽限制.我使用的测试代码如下.当我用-O2它编译它需要1.7秒.当我用-O2 -mavx它编译它只需要1.0秒.非vex编码的标量操作慢了70%!为什么是这样?
系统:i7-6700HQ@2.60GHz(Skylake)32 GB内存,Ubuntu 16.10,GCC 6.3
测试代码
//gcc -O2 -fopenmp test.c
//or
//gcc -O2 -mavx -fopenmp test.c
#include <string.h>
#include <stdio.h>
#include <x86intrin.h>
#include <omp.h>
#define N 1000000
#define R 1000
void mul(double *a, double *b) {
for (int i = 0; i<N; i++) a[i] …Run Code Online (Sandbox Code Playgroud) 我有一个图像绘制例程,为 SSE、SSE2、SSE3、SSE4.1、SSE4.2、AVX 和 AVX2 编译多次。我的程序通过检查 CPUID 标志来动态调度这些二进制变体之一。
在 Windows 上,我检查 Windows 版本,如果操作系统不支持 AVX/AVX2 调度,则禁用它们。(例如,仅 Windows 7 SP1 或更高版本支持 AVX/AVX2。)
我想在 Mac OS X 上做同样的事情,但我不确定哪个版本的 OS X 支持 AVX/AVX2。
请注意,我想知道的是与 AVX/AVX2 一起使用的 OS X 的最低版本。不支持 AVX/AVX2 的机器型号。