9

Windows 用の新しいコードを書いているとき_cpuinfo()に、Windows API に出くわしました。私は主に Linux 環境 (GCC) を扱っているので、CPUInfo にアクセスしたいと考えています。

私は次のことを試しました:

#include <iostream>
 
int main()
{
  int a, b;
 
  for (a = 0; a < 5; a++)
  {
    __asm ( "mov %1, %%eax; "            // a into eax
          "cpuid;"
          "mov %%eax, %0;"             // eax into b
          :"=r"(b)                     // output
          :"r"(a)                      // input
          :"%eax","%ebx","%ecx","%edx" // clobbered register
         );
    std::cout << "The CPUID level " << a << " gives EAX= " << b << '\n';
  }
 
  return 0;
}

これはアセンブリを使用しますが、車輪を再発明したくありません。アセンブリなしで CPUInfo を実装する他の方法はありますか?

4

2 に答える 2

38

GCC でコンパイルしているので、cpuid.hこれらの関数を宣言するものを含めることができます。

/* Return highest supported input value for cpuid instruction.  ext can
   be either 0x0 or 0x8000000 to return highest supported value for
   basic or extended cpuid information.  Function returns 0 if cpuid
   is not supported or whatever cpuid returns in eax register.  If sig
   pointer is non-null, then first four bytes of the signature
   (as found in ebx register) are returned in location pointed by sig.  */
unsigned int __get_cpuid_max (unsigned int __ext, unsigned int *__sig)

/* Return cpuid data for requested cpuid level, as found in returned
   eax, ebx, ecx and edx registers.  The function checks if cpuid is
   supported and returns 1 for valid cpuid information or 0 for
   unsupported cpuid level.  All pointers are required to be non-null.  */
int __get_cpuid (unsigned int __level,
    unsigned int *__eax, unsigned int *__ebx,
    unsigned int *__ecx, unsigned int *__edx)

この機能を再実装する必要はありません。

于 2013-01-10T20:44:07.717 に答える
8
for (a =0; a < 5; ++a;)

セミコロンは 2 つだけにする必要があります。あなたは3つ持っています。

これは基本的な C/C++ 構文です。CPUID はニシンです。

于 2013-01-10T20:45:33.850 に答える