Bagikan melalui


Fungsi GetLogicalProcessorInformation (sysinfoapi.h)

Mengambil informasi tentang prosesor logis dan perangkat keras terkait.

Untuk mengambil informasi tentang prosesor logis dan perangkat keras terkait, termasuk grup prosesor, gunakan fungsi GetLogicalProcessorInformationEx .

Sintaks

BOOL GetLogicalProcessorInformation(
  [out]     PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
  [in, out] PDWORD                                ReturnedLength
);

Parameter

[out] Buffer

Penunjuk ke buffer yang menerima array struktur SYSTEM_LOGICAL_PROCESSOR_INFORMATION . Jika fungsi gagal, konten buffer ini tidak terdefinisi.

[in, out] ReturnedLength

Pada input, menentukan panjang buffer yang diacu oleh Buffer, dalam byte. Jika buffer cukup besar untuk berisi semua data, fungsi ini berhasil dan ReturnLength diatur ke jumlah byte yang dikembalikan. Jika buffer tidak cukup besar untuk berisi semua data, fungsi gagal, GetLastError mengembalikan ERROR_INSUFFICIENT_BUFFER, dan ReturnLength diatur ke panjang buffer yang diperlukan untuk berisi semua data. Jika fungsi gagal dengan kesalahan selain ERROR_INSUFFICIENT_BUFFER, nilai ReturnLength tidak terdefinisi.

Nilai kembali

Jika fungsi berhasil, nilai yang dikembalikan adalah TRUE dan setidaknya satu struktur SYSTEM_LOGICAL_PROCESSOR_INFORMATION ditulis ke buffer output.

Jika fungsi gagal, nilai yang dikembalikan adalah FALSE. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

GetLogicalProcessorInformation dapat digunakan untuk mendapatkan informasi tentang hubungan antara prosesor logis dalam sistem, termasuk:

  • Prosesor logis yang merupakan bagian dari simpul NUMA .
  • Prosesor logis yang berbagi sumber daya. Contoh jenis berbagi sumber daya ini adalah skenario hyperthreading.
Aplikasi Anda dapat menggunakan informasi ini saat menentukan utas dan proses Anda untuk memanfaatkan properti perangkat keras platform dengan sebaik-baiknya, atau menentukan jumlah prosesor logis dan fisik untuk tujuan lisensi.

Setiap struktur SYSTEM_LOGICAL_PROCESSOR_INFORMATION yang dikembalikan dalam buffer berisi yang berikut ini:

  • Masker afinitas prosesor logis, yang menunjukkan prosesor logis tempat informasi dalam struktur berlaku.
  • Masker prosesor logis jenis LOGICAL_PROCESSOR_RELATIONSHIP, yang menunjukkan hubungan antara prosesor logis dalam masker. Aplikasi yang memanggil fungsi ini harus disiapkan untuk menangani nilai indikator tambahan di masa mendatang.
Perhatikan bahwa urutan di mana struktur dikembalikan dalam buffer dapat berubah di antara panggilan ke fungsi ini.

Ukuran struktur SYSTEM_LOGICAL_PROCESSOR_INFORMATION bervariasi antara arsitektur prosesor dan versi Windows. Untuk alasan ini, aplikasi harus terlebih dahulu memanggil fungsi ini untuk mendapatkan ukuran buffer yang diperlukan, lalu secara dinamis mengalokasikan memori untuk buffer.

Pada sistem dengan lebih dari 64 prosesor logis, fungsi GetLogicalProcessorInformation mengambil informasi prosesor logis tentang prosesor dalam grup prosesor tempat utas panggilan saat ini ditetapkan. Gunakan fungsi GetLogicalProcessorInformationEx untuk mengambil informasi tentang prosesor di semua grup prosesor pada sistem.

Catatan

Dimulai dengan TBD Release Iron, perilaku fungsi NUMA ini dan lainnya telah dimodifikasi untuk mendukung sistem dengan lebih baik dengan simpul yang berisi lebih dari 64 prosesor. Untuk informasi selengkapnya tentang perubahan ini, termasuk informasi tentang mengaktifkan perilaku lama API ini, lihat Dukungan NUMA.

Perilaku yang dimulai dengan Besi Rilis TBD

Struktur hubungan untuk RelationNumaNode berisi masker afinitas untuk afinitas simpul dalam grup utas panggilan.

Contoh

Contoh C++ berikut menggunakan fungsi GetLogicalProcessorInformation untuk menampilkan informasi tentang prosesor pada sistem saat ini. Karena GetLogicalProcessorInformation tidak ada di semua sistem, contoh ini menggunakan fungsi GetProcAddress alih-alih memanggil GetLogicalProcessorInformation secara langsung.

Contoh ini melaporkan jumlah inti prosesor aktif. Contoh ini juga melaporkan jumlah simpul NUMA, paket fisik, dan cache pada sistem yang mendukung informasi ini. Untuk informasi selengkapnya, lihat deskripsi anggota Hubungan dari struktur SYSTEM_LOGICAL_PROCESSOR_INFORMATION . Windows Server 2003, Windows XP Professional x64 Edition, dan Windows XP dengan SP3: Contoh ini melaporkan jumlah prosesor fisik daripada jumlah inti prosesor aktif.


#include <windows.h>
#include <malloc.h>    
#include <stdio.h>
#include <tchar.h>

typedef BOOL (WINAPI *LPFN_GLPI)(
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, 
    PDWORD);


// Helper function to count set bits in the processor mask.
DWORD CountSetBits(ULONG_PTR bitMask)
{
    DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1;
    DWORD bitSetCount = 0;
    ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;    
    DWORD i;
    
    for (i = 0; i <= LSHIFT; ++i)
    {
        bitSetCount += ((bitMask & bitTest)?1:0);
        bitTest/=2;
    }

    return bitSetCount;
}

int _cdecl _tmain ()
{
    LPFN_GLPI glpi;
    BOOL done = FALSE;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
    DWORD returnLength = 0;
    DWORD logicalProcessorCount = 0;
    DWORD numaNodeCount = 0;
    DWORD processorCoreCount = 0;
    DWORD processorL1CacheCount = 0;
    DWORD processorL2CacheCount = 0;
    DWORD processorL3CacheCount = 0;
    DWORD processorPackageCount = 0;
    DWORD byteOffset = 0;
    PCACHE_DESCRIPTOR Cache;

    glpi = (LPFN_GLPI) GetProcAddress(
                            GetModuleHandle(TEXT("kernel32")),
                            "GetLogicalProcessorInformation");
    if (NULL == glpi) 
    {
        _tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n"));
        return (1);
    }

    while (!done)
    {
        DWORD rc = glpi(buffer, &returnLength);

        if (FALSE == rc) 
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
            {
                if (buffer) 
                    free(buffer);

                buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
                        returnLength);

                if (NULL == buffer) 
                {
                    _tprintf(TEXT("\nError: Allocation failure\n"));
                    return (2);
                }
            } 
            else 
            {
                _tprintf(TEXT("\nError %d\n"), GetLastError());
                return (3);
            }
        } 
        else
        {
            done = TRUE;
        }
    }

    ptr = buffer;

    while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) 
    {
        switch (ptr->Relationship) 
        {
        case RelationNumaNode:
            // Non-NUMA systems report a single record of this type.
            numaNodeCount++;
            break;

        case RelationProcessorCore:
            processorCoreCount++;

            // A hyperthreaded core supplies more than one logical processor.
            logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
            break;

        case RelationCache:
            // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache. 
            Cache = &ptr->Cache;
            if (Cache->Level == 1)
            {
                processorL1CacheCount++;
            }
            else if (Cache->Level == 2)
            {
                processorL2CacheCount++;
            }
            else if (Cache->Level == 3)
            {
                processorL3CacheCount++;
            }
            break;

        case RelationProcessorPackage:
            // Logical processors share a physical package.
            processorPackageCount++;
            break;

        default:
            _tprintf(TEXT("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n"));
            break;
        }
        byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
        ptr++;
    }

    _tprintf(TEXT("\nGetLogicalProcessorInformation results:\n"));
    _tprintf(TEXT("Number of NUMA nodes: %d\n"), 
             numaNodeCount);
    _tprintf(TEXT("Number of physical processor packages: %d\n"), 
             processorPackageCount);
    _tprintf(TEXT("Number of processor cores: %d\n"), 
             processorCoreCount);
    _tprintf(TEXT("Number of logical processors: %d\n"), 
             logicalProcessorCount);
    _tprintf(TEXT("Number of processor L1/L2/L3 caches: %d/%d/%d\n"), 
             processorL1CacheCount,
             processorL2CacheCount,
             processorL3CacheCount);
    
    free(buffer);

    return 0;
}


Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista, Windows XP Professional x64 Edition, Windows XP dengan SP3 [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header sysinfoapi.h
Pustaka Kernel32.lib
DLL Kernel32.dll

Lihat juga

GetLogicalProcessorInformationEx

LOGICAL_PROCESSOR_RELATIONSHIP

Fungsi Proses dan Utas

SYSTEM_LOGICAL_PROCESSOR_INFORMATION