dovelemon的专栏

SSE介绍

在学习3D游戏编程大师技巧的时候,就了解到,可是使用一种称之为“单指令,多数据(SIMD)”的技术来编写3D数学库。通过这样的方法,可以将我们经常使用的诸如向量计算,矩阵变换等操作加快很多倍。这次,在学习3D引擎开发的时候,也用到了这个技术。SIMD是一种技术的名称,而并不是具体的工具。实现这种技术,不同的CPU厂商推出了不同的技术,像MMX, 3DNow!, SSE, SSE2, SSE3…。由于我的计算机上使用的是Intel的处理器,它支持MMX,SSE,SSE2,所以在这里我使用SSE的指令来进行。如果你使用的是AMD处理器,并且支持!3DNow!的话,不用担心,虽然他们是不同的厂商,但是他们的指令使用的是同一个标准,所以依然能够使用这里的代码。

SSE支持

为了能够使用SSE指令,来加快向量计算的速度。我们需要知道我们的CPU和操作系统是否支持SSE指令代码。对于这样的查询,我们可以在汇编代码中使用如下的代码来获取CPU特性表示符:

mov eax , 1

CPUID

mov flag, edx

这样,flag中就保存了我们CPU的特性值了。然后只要解析这个特性值就能够判断我们的计算机是否支持上面提到的那些指令集 了。但是,,在这里,我并不使用这种方法。如果读者希望使用这样的方法的话,可以自行上网上进行有关资料的查询。

在这里,我使用MSDN网站上提供的一个示例代码来完成这个判断。

想要使用的同学只要简单的下载,编译运行,就能够知道你的计算机是否支持SSE了。

我在此基础上,进行了修改,以下是ZFXEngine中用来判断用户计算机是否支持SSE的代码:

<span style="font-family:Microsoft YaHei;">#include"ZFX3D.h"#include<iostream>#include<stdio.h>#include<fstream>#include"cpuid.h"using namespace ZFXEngine ;using namespace std ;/*** Global variant*/bool g_bSSE = false ;//Check if the operate system support ssevoid expand(int avail, int mask, ofstream* pOut){char buffer[64];if (mask & _CPU_FEATURE_MMX) {sprintf(buffer,"\t%s\t_CPU_FEATURE_MMX\n",avail & _CPU_FEATURE_MMX ? "yes" : "no");(*pOut)<<buffer;}if (mask & _CPU_FEATURE_SSE) {sprintf(buffer,"\t%s\t_CPU_FEATURE_SSE\n",avail & _CPU_FEATURE_SSE ? "yes" : "no");(*pOut)<<buffer;}if (mask & _CPU_FEATURE_SSE2) {sprintf(buffer,"\t%s\t_CPU_FEATURE_SSE2\n",avail & _CPU_FEATURE_SSE2 ? "yes" : "no");(*pOut)<<buffer;}if (mask & _CPU_FEATURE_3DNOW) {sprintf(buffer,"\t%s\t_CPU_FEATURE_3DNOW\n",avail & _CPU_FEATURE_3DNOW ? "yes" : "no");(*pOut)<<buffer;}}//———————————————————————————————bool ZFX3DInitCPU(void) { _p_info info;_cpuid(&info);ofstream out ;out.open("ZFXEngine_CPU_Info.log");char buffer[64];sprintf(buffer,"v_name:\t\t%s\n", info.v_name);out<<buffer;sprintf(buffer,"model:\t\t%s\n", info.model_name);out<<buffer;sprintf(buffer,"family:\t\t%d\n", info.family);out<<buffer;sprintf(buffer,"model:\t\t%d\n", info.model);out<<buffer;sprintf(buffer,"stepping:\t%d\n", info.stepping);out<<buffer;sprintf(buffer,"feature:\t%08x\n", info.feature);out<<buffer;expand(info.feature, info.checks, &out);sprintf(buffer,"os_support:\t%08x\n", info.os_support);out<<buffer;expand(info.os_support, info.checks,&out);sprintf(buffer,"checks:\t\t%08x\n", info.checks);out<<buffer;if((info.feature & _CPU_FEATURE_SSE)&&(info.os_support & _CPU_FEATURE_SSE))g_bSSE = true ;elseg_bSSE = false ;out.close();return g_bSSE ;}// end for ZFX3DInitCPU</span> 用户只需要调用ZFX3DInitCPU()就可以知道是否支持SSE了,并且这个函数会将用户的CPU信息打印出来,如下所示:

<span style="font-family:Microsoft YaHei;">v_name:GenuineIntelmodel:INTEL Pentium-IIIfamily:6model:10stepping: 9feature: 00000007yes _CPU_FEATURE_MMXyes _CPU_FEATURE_SSEyes _CPU_FEATURE_SSE2no _CPU_FEATURE_3DNOWos_support: 00000007yes _CPU_FEATURE_MMXyes _CPU_FEATURE_SSEyes _CPU_FEATURE_SSE2no _CPU_FEATURE_3DNOWchecks:0000000f</span>

ZFXVector实现

如下是ZFXVector的头文件:

读书破万卷,下笔如有神。

dovelemon的专栏

相关文章:

你感兴趣的文章:

标签云: