多媒体指令支持级设置
当前多媒体指令集很多,需要设置一个支持程度的“级”,按其支持位长度,分为“三级”,分别对应于:
一级: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的指令集需要有关资料进一步试验验证。
浙公网安备 33010602011771号