多媒体指令加速级(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