多媒体指令支持级设置

    当前多媒体指令集很多,需要设置一个支持程度的“级”,按其支持位长度,分为“三级”,分别对应于:

一级: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的指令集需要有关资料进一步试验验证。  

  

posted @ 2020-05-09 19:15  hbg200  阅读(286)  评论(0编辑  收藏  举报