设置多媒体指令加速级

  多媒体指令加速级(Multimedia instruction acceleration level,MIAL)是将多媒体指令分为“级”,按不同能力采用不同加速方案,这里给出思路、方案、及源代码。针对单精度浮点,主要应用于人工智能、视频、3维等并行运算。

1. 分级加速方案,有助于自动有效利用系统资源,提高程序运行速度,这里给出3级区别

    0级:CPU不支持多媒体加速指令,无加速能力。

    1级:使用SSE2指令集,寄存器为16字节(128位)长度。支持4个单精度浮点同时计算,4倍运算加速。

    2级:使用AVX2指令集,寄存器为32字节(256位)长度。支持8个单精度浮点同时计算,8倍运算加速。

    3级:使用AVX512F指令集,寄存器为64字节(512位)长度。支持16个单精度浮点同时计算,16倍运算加速。

2. 源代码

#include <intrin.h>
 
int const CpuAccLevel_1 = 1; // 使用一级多媒体指令 1: SSE2
int const CpuAccLevel_2 = 2; // 使用二级多媒体指令 2: AVX2
int const CpuAccLevel_3 = 3; // 使用三级多媒体指令 3: AVX512F

static const int Mark_SSE2 = 0x04000000;    // 0000 0100 0000 0000 0000 0000 0000 0000 | 26
static const int Mark_AVX2 = 0x00000010;    // 0000 0000 0000 0000 0000 0000 0001 0000 | 5
static const int Mark_AVX512F = 0x00010000; // 0000 0000 0000 0001 0000 0000 0000 0000 | 16

static bool bSSE2_Extensions,
            bAVX2_Extensions,
            bAVX512F_Extensions;

int GetCpuAccLevel(void) // 获取CPU指令级
{
    int dwRet,CPUInfo[4];

    __cpuid(CPUInfo, 1); // 常规选项

    if (CPUInfo[3] & Mark_SSE2) 
        bSSE2_Extensions = true;
        else
        bSSE2_Extensions = false;

    __cpuid(CPUInfo, 7);

    if (CPUInfo[1] & Mark_AVX2) 
        bAVX2_Extensions = true;
        else
        bAVX2_Extensions = false;

    if (CPUInfo[1] & Mark_AVX512F) 
        bAVX512F_Extensions = true;
        else
        bAVX512F_Extensions = false;

    dwRet = 0;
    if (bAVX512F_Extensions)
        dwRet = CpuAccLevel_3;
        else
    if (bAVX2_Extensions)
	       dwRet = CpuAccLevel_2;  
        else
    if (bSSE2_Extensions) 
        dwRet = CpuAccLevel_1;
         
    return dwRet;
}

注:

1. 在VS2017 c++ 调试通过。

2. 仅在工作机(Intel主机SSE2指令集)测试通过,其他未测试。

3. 近期上市的 Intel 11 代处理器开始支持AVX512F指令集。

4. 由于 Intel 11 代处理器明确支持AVX512F指令集,所以简化了我的《多媒体指令支持级设置》。

5. 未发现 VS2017/VS2019 c++ 支持AVX512F指令集。

参考资料

1. https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?redirectedfrom=MSDN&view=msvc-150

 

posted @ 2021-05-06 22:38  hbg200  阅读(209)  评论(0编辑  收藏  举报