影响SSE指令使用的因素-cpu特征

# 采用cpuid、_cpuid、_cpuidex函数可获取cpu特征,但这三个函数的使用函数有一定的限制与要求
a. 32位操作系统
在32位操作系统下,可以直接采用内嵌会变调用cpuid函数获取cpu特征,方法如下
//用于存储cpu四个寄存器值
unsigned long _eax, _ebx, _ecx, _edx;
void ExcuteCpuid()
{
_asm
{
mov eax, 1;
cpuid;
mov _eax, eax;
mov _ebx, ebx;
mov _ecx, ecx;
mov _edx, edx;
}
}
b. 64位操作系统直接调用调用Intrinsics函数“_cpuid、_cpuidex”函数获取cpu特征。但是只有vc2005以上版本才有intrin.h头文件,且支持_cpuid函数,vc2010版本以上才支持_cpuidex函数,所以我们首先通过编译器版本确定头文件包含和指令调用,vc编译器版本判断如下
//_MSC_VER是微软C/C++编译器——cl.exe编译代码时预定义的一个宏,它的值表示cl的版本,它的类型是“int”。例如
#if _MSC_VER >=1200 // VC++6.0以上
#if _MSC_VER >=1300 // VC2003以上
#if _MSC_VER >=1400 // VC2005以上
#if _MSC_VER >=1500 // VC2008以上
#if _MSC_VER >=1600 // VC2010以上
总结a、 b两点,代码为
->>#if defined _MSC_VER >= 1400 //vc版本为2005以上
->>#include “intrin.h”
->> #endif

->>#if defined (_WIN64)
//64为操作系统,直接调用”intrin.h”中函数
->> #else
#if _MSC_VER < 1600
->>void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
->> {
->> if (NULL==CPUInfo) return;
->> _asm{
// load. 读取参数到寄存器
->>mov edi, CPUInfo; // 准备用edi寻址CPUInfo
->> mov eax, InfoType;
->>mov ecx, ECXValue;
->> cpuid;
// save. 将寄存器保存到CPUInfo
->>mov [edi], eax;
->>mov [edi+4], ebx;
->> mov [edi+8], ecx;
->>mov [edi+12], edx;
}
}
->>#endif // #if _MSC_VER < 1600

->> #if _MSC_VER < 1400
->>void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
->>{
->>__cpuidex(CPUInfo, InfoType, 0);
->>}
->>#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid

->>#endif // #if defined(_WIN64)

# cpu特征对应的sse指令集
1. edx: (bit23) == 1 —————MMX
2. edx: (bit25) == 1 —————SSE1
3. ecx: (bit26) == 1 —————SSE2
4. ecx: (bit0 ) == 1 —————SSE3
5. ecx: (bit9 ) == 1 —————SSSE3
6. ecx: (bit19) == 1 —————SSE4.1
7. ecx: (bit20) == 1 —————SSE4.2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值