当前多媒体指令集很多,需要设置一个支持程度的“级”,按其支持位长度,分为“三级”,分别对应于:
一级:SSE2指令集,支持128位
二级:AVX2指令集,支持256位
三级:AVX512指令集,支持512位
开机检测处理器的支持能力,并设置一个全局变量的支持“级”,供全局函数使用,从而自动实现最佳指令集的支持。开机检测使用了一个函数,设置支持“级”,从头文件引出。
SetCpuAccLevel.h头文件
#pragma once #include <windows.h> const DWORD AccInstLevel_1 = 1; // 使用一级多媒体指令 const DWORD AccInstLevel_2 = 2; // 使用二级多媒体指令 const DWORD AccInstLevel_3 = 3; // 使用三级多媒体指令 bool SetCpuAccLevel(void); // 设置CPU加速级 extern DWORD g_AccInstLevel; // 加速指令级 0: NO 1: SSE2 2: AVX2 3: AVX512
SetCpuAccLevel.cpp实现文件
#include <intrin.h>
#include "SetCpuAccLevel.h"
const int Mark_SSE2 = 0x04000000; // 0000 0100 0000 0000 0000 0000 0000 0000 | 26
const int Mark_AVX2 = 0x00000010; // 0000 0000 0000 0000 0000 0000 0001 0000 | 5
const int Mark_AVX512F  = 0x00010000; // 0000 0000 0000 0001 0000 0000 0000 0000 | 16
const int Mark_AVX512PF = 0x04000000; // 0000 0100 0000 0000 0000 0000 0000 0000 | 26
const int Mark_AVX512ER = 0x08000000; // 0000 1000 0000 0000 0000 0000 0000 0000 | 27
const int Mark_AVX512CD = 0x10000000; // 0001 0000 0000 0000 0000 0000 0000 0000 | 28
bool bSSE2_Extensions,
     bAVX2_Extensions,
     bAVX512F_Extensions,
     bAVX512PF_Extensions,
     bAVX512ER_Extensions,
     bAVX512CD_Extensions;
DWORD g_AccInstLevel; // 加速指令级 0: NO 1: SSE2 2: AVX2 3: AVX512
bool SetCpuAccLevel(void) // 设置CPU加速级
{
    int CPUInfo[4];
    __cpuid(CPUInfo, 1); // 常规选项
    if (CPUInfo[3] & Mark_SSE2) // EDX = 3
        bSSE2_Extensions = true;
        else
        bSSE2_Extensions = false;
    __cpuid(CPUInfo, 7);
    if (CPUInfo[1] & Mark_AVX2) // EBX = 1
        bAVX2_Extensions = true;
        else
        bAVX2_Extensions = false;
    if (CPUInfo[1] & Mark_AVX512F) // EBX = 1
        bAVX512F_Extensions = true;
        else
        bAVX512F_Extensions = false;
    if (CPUInfo[1] & Mark_AVX512PF) // EBX = 1
        bAVX512PF_Extensions = true;
        else
        bAVX512PF_Extensions = false;
    if (CPUInfo[1] & Mark_AVX512ER) // EBX = 1
	bAVX512ER_Extensions = true;
        else
	bAVX512ER_Extensions = false;
    if (CPUInfo[1] & Mark_AVX512CD) // EBX = 1
	bAVX512CD_Extensions = true;
        else
	bAVX512CD_Extensions = false;
    g_AccInstLevel = 0;//初始“0级”
    if (bAVX512F_Extensions | bAVX512PF_Extensions | bAVX512ER_Extensions | bAVX512CD_Extensions)
    {
	g_AccInstLevel = AccInstLevel_3;
        return true;
    }
    else
    if (bAVX2_Extensions)
    {
	g_AccInstLevel = AccInstLevel_2;
        return true;
    }
    else
    if (bSSE2_Extensions)
    { 
        g_AccInstLevel = AccInstLevel_1;
        return true; 
    }
    
    return false;
}
检测片段
if (!SetCpuAccLevel())//检测CPU支持的多媒体指令集,并设置为“级”
{
     MessageBox(NULL, "本机CPU不支持SSE2及以上指令集,无法加速,程序即将退出", "", MB_TOPMOST | MB_OK);
     return 0;
}
在 Visual Studio 2017 C++ 编译通过。
参考链接:https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?redirectedfrom=MSDN&view=vs-2019
注:
1. 仅在intel工作机测试,支持到SSE2指令集,设置为“一级”。
2. 有关其他指令集和AMD的指令集需要有关资料进一步试验验证。
原文:https://www.cnblogs.com/hbg200/p/12859629.html