4

実行時に使用されている CPU を検出するにはどうすればよいですか? c++ コードは、AMD/Intel アーキテクチャを区別する必要がありますか? gcc 4.2 を使用しています。

4

6 に答える 6

11

Linux (または Cygwin で実行されている Windows) を使用している場合は、特殊ファイル/proc/cpuinfoを読み取り、 vendor_id. 文字列がGenuineIntelの場合、Intel チップで実行しています。が表示された場合はAuthenticAMD、AMD チップで実行されています。

void get_vendor_id(char *vendor_id)  // must be at least 13 bytes
{
    FILE *cpuinfo = fopen("/proc/cpuinfo", "r");
    if(cpuinfo == NULL)
        ;  // handle error
    char line[256];
    while(fgets(line, 256, cpuinfo))
    {
        if(strncmp(line, "vendor_id", 9) == 0)
        {
            char *colon = strchr(line, ':');
            if(colon == NULL || colon[1] == 0)
                ;  // handle error
            strncpy(vendor_id, 12, colon + 2);
            fclose(cpuinfo);
            return;
        }
    }

    // if we got here, handle error
    fclose(cpuinfo);
}

x86 アーキテクチャで実行していることがわかっている場合、移植性の低い方法は CPUID 命令を使用することです。

void get_vendor_id(char *vendor_id)  // must be at least 13 bytes
{
    // GCC inline assembler
    __asm__ __volatile__
        ("movl $0, %%eax\n\t"
         "cpuid\n\t"
         "movl %%ebx, %0\n\t"
         "movl %%edx, %1\n\t"
         "movl %%ecx, %2\n\t"
         : "=m"(vendor_id), "=m"(vendor_id + 4), "=m"(vendor_id + 8)  // outputs
         : // no inputs
         : "%eax", "%ebx", "%edx", "%ecx", "memory");  // clobbered registers
    vendor_id[12] = 0;
}

int main(void)
{
    char vendor_id[13];
    get_vendor_id(vendor_id);

    if(strcmp(vendor_id, "GenuineIntel") == 0)
        ; // it's Intel
    else if(strcmp(vendor_id, "AuthenticAMD") == 0)
        ; // it's AMD
    else
        ; // other
    return 0;
}
于 2009-01-21T18:14:25.027 に答える
2

Windows では、GetNativeSystemInfo関数を使用できます。

Linux では、sysinfoを試してください。

于 2009-01-21T18:20:00.490 に答える
0

私は小さなプロジェクトを投稿しました: http ://sourceforge.net/projects/cpp-cpu-monitor/ これはlibgtopライブラリを使用し、UDPを介してデータを公開します。ニーズに合わせて変更できます。GPLオープンソース。ご不明な点がございましたらお問い合わせください。

于 2013-02-05T10:55:41.713 に答える