SourceForge.jp

dkutilCPU.h

説明を見る。
00001 
00007 #ifndef _dkutilCPU_h___
00008 #define _dkutilCPU_h___
00009 
00010 #include "dkutilDefined.h"
00011 #include "dkutilLog.h"
00012 
00013 namespace dkutil{
00014 
00015 #ifndef _MSC_VER
00016 
00017 inline ULONGLONG RDTSC(){
00018     typedef ULONGLONG (__fastcall *RDTSC_TYPE)();
00019     RDTSC_TYPE t;
00020     static const BYTE rdtsc[]={
00021         0x55                                     //push             ebp
00022         ,0x8B,0xEC                              //mov       ,0x ebp,esp
00023         ,0x83,0xEC,0x44                      //sub               esp,44h
00024         ,0x53                                    //push             ebx
00025         ,0x56                                // push                esi
00026         ,0x57                                // push                edi
00027         ,0x51                               //   push               ecx
00028         ,0x8D,0x7D,0xBC              //     lea              edi,[ebp-44h]
00029         ,0xB9,0x11,0x00,0x00,0x00       //   mov                 ecx,11h
00030         ,0xB8,0xCC,0xCC,0xCC,0xCC       //   mov                 eax,0CCCCCCCCh
00031         ,0xF3,0xAB                       //  rep stos       dword ptr [edi]
00032         ,0x59                               //   pop                 ecx
00033         ,0x89,0x4D,0xFC                 //   mov                 dword ptr [ebp-4],ecx
00034         ,0x0F,0x31                       //  rdtsc
00035         ,0x5F                               //   pop                 edi
00036         ,0x5E                               //   pop                 esi
00037         ,0x5B                               //   pop                 ebx
00038         ,0x83,0xC4,0x44                 //   add                 esp,44h
00039         ,0x3B,0xEC                       //  cmp                 ebp,esp
00040         ,0xE8,0x14,0x34,0x00,0x00       //   call               __chkesp (00405fb0)
00041         ,0x8B,0xE5                       //  mov                 esp,ebp
00042         ,0x5D                               //   pop                 ebp
00043         ,0xC3                               //   ret
00044     };
00045     t = reinterpret_cast<RDTSC_TYPE>(&rdtsc);
00046     return t();
00047 }
00048 #else
00049 
00050 
00051 
00052 #pragma warning(disable:4035)
00053 inline ULONGLONG __fastcall RDTSC(){
00054     _asm{
00055         RDTSC
00056     }
00057 }
00058 #pragma warning(default:4035)
00059 #endif
00060 
00061 
00062 class CPUInfo{
00063 public:
00064     struct CPU_INFO{
00065         char CPUName[256];
00066         char CPUType[128];
00067         bool bFPU           ;
00068         bool bTSC       ;
00069         bool bCMOV      ;
00070         bool bFCMOV     ;
00071         bool bCPUID     ;
00072         bool bMMX   ;
00073         bool bMMX2      ;
00074         bool bSSE       ;
00075         bool bSSE2  ;
00076         bool b3DNOW         ;
00077         bool bE3DNOW        ;
00078         long TypeID     ;
00079         long FamilyID   ;
00080         long ModelID;
00081         long SteppingID ;
00082         long CPUClock   ;
00083     };
00084 private:
00085     static CPU_INFO minfo;
00086 //BOOST_PROTECTED:
00087     CPU_INFO &GetInfoRef(){return minfo;}
00088 public:
00089     CPUInfo(){
00090         ::memset(&minfo,0,sizeof(minfo));
00091         GetCPUInformation();
00092     }
00093     virtual ~CPUInfo(){}
00094     
00096     bool isMMX(){return minfo.bMMX;}
00098     bool isMMX2(){return minfo.bMMX2;}
00100     bool isSSE(){return minfo.bSSE;}
00102     bool isSSE2(){return minfo.bSSE2;}
00104     bool is3DNOW(){return minfo.b3DNOW;}
00106     bool isE3DNOW(){return minfo.bE3DNOW;}
00108     long CPUClock(){
00109         if(minfo.CPUClock==0){
00110             minfo.CPUClock = BenchCPUClock(minfo.bTSC);
00111         }
00112         return minfo.CPUClock;
00113     }
00115     bool isFPU(){return minfo.bFPU;}
00117     static bool isTSC(){return minfo.bTSC;}
00119     bool isCPUID(){return minfo.bCPUID;}
00124 
00125     void CopyCPUName(char *buff,size_t buffsize){
00126         strncpy(buff,minfo.CPUName,buffsize);
00127     }
00128 
00129 
00132     void CopyCPUType(char *buff,size_t buffsize){
00133         strncpy(buff,minfo.CPUType,buffsize);
00134     }
00135 
00140     long BenchCPUClock(long bTSC=isTSC());
00143     void GetCPUInformation( bool isAll=false );
00144     
00149 
00150     void CPUInfoToCharPtr(char *a,size_t buffsize);
00151     
00153     void LogoutHTML(HTMLLog &logger)
00154     {
00155         //--------------------------------------------------
00156         // チェック完了〜
00157         //--------------------------------------------------
00158         char CPUName[256]="";
00159         if ( (strlen(minfo.CPUType)>0) && (strlen(minfo.CPUName)>0) )
00160         {
00161             strncpy(CPUName,minfo.CPUName,256);
00162             strncat( CPUName, " - " ,256);
00163             strncat( CPUName, minfo.CPUType,256 );
00164         }
00165         else
00166         {
00167             strncpy( CPUName, "UnKnown" ,256);
00168         }
00169 
00170         // ログ
00171         logger.LogoutKeyword( "CPU Information" );
00172         logger.LogoutNextLine();
00173 
00174         logger.Logout( "   Name [ %s ]", CPUName );
00175         logger.LogoutNextLine();
00176 
00177         logger.Logout( "   Clock [ %uMHz ]", minfo.CPUClock );
00178         logger.LogoutNextLine();
00179 
00180         logger.Logout( "   Type [ %u ] Family [ %u ] Model [ %u ] Stepping [ %u ]",
00181             minfo.TypeID, minfo.FamilyID, minfo.ModelID, minfo.SteppingID );
00182         logger.LogoutNextLine();
00183 
00184         logger.Logout( "   FPU %s : CPUID %s : MMX %s\n",
00185             (minfo.bFPU  )?("○"):("×"),
00186             (minfo.bCPUID )?("○"):("×"), (minfo.bMMX )?("○"):("×") );
00187         logger.LogoutNextLine();
00188         logger.Logout( "   MMX2 %s : SSE %s : SSE2 %s\n",
00189             (minfo.bMMX2 )?("○"):("×"),
00190             (minfo.bSSE   )?("○"):("×"), (minfo.bSSE2)?("○"):("×") );
00191         logger.LogoutNextLine();
00192         logger.Logout( "   3DNow %s : E3DNow %s : CMOV %s\n",
00193             (minfo.b3DNOW)?("○"):("×"), (minfo.bE3DNOW)?("○"):("×"),
00194             (minfo.bCMOV)?("○"):("×") );
00195         logger.LogoutNextLine();
00196         logger.Logout( "   FCMOV %s : TSC %s\n",
00197             (minfo.bFCMOV)?("○"):("×"), (minfo.bTSC   )?("○"):("×") );
00198         logger.LogoutNextLine();
00199 
00200         logger.LogoutNextLine();
00201     }
00202 
00203 };
00204 
00205 }//end of dkutil namespace
00206 
00207 #endif //end of include once

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:07 2003に生成されました。 doxygen 1.3.5