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