设置多媒体指令加速级
多媒体指令加速级(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
浙公网安备 33010602011771号