Función GetLogicalProcessorInformation (sysinfoapi.h)

Recupera información sobre procesadores lógicos y hardware relacionado.

Para recuperar información sobre los procesadores lógicos y el hardware relacionado, incluidos los grupos de procesadores, use la función GetLogicalProcessorInformationEx .

Sintaxis

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

Parámetros

[out] Buffer

Puntero a un búfer que recibe una matriz de estructuras de SYSTEM_LOGICAL_PROCESSOR_INFORMATION . Si se produce un error en la función, el contenido de este búfer no está definido.

[in, out] ReturnedLength

En la entrada, especifica la longitud del búfer al que apunta buffer, en bytes. Si el búfer es lo suficientemente grande como para contener todos los datos, esta función se realiza correctamente y ReturnLength se establece en el número de bytes devueltos. Si el búfer no es lo suficientemente grande como para contener todos los datos, se produce un error en la función, GetLastError devuelve ERROR_INSUFFICIENT_BUFFER y ReturnLength se establece en la longitud del búfer necesaria para contener todos los datos. Si se produce un error en la función que no sea ERROR_INSUFFICIENT_BUFFER, el valor de ReturnLength no está definido.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es TRUE y al menos una estructura de SYSTEM_LOGICAL_PROCESSOR_INFORMATION se escribe en el búfer de salida.

Si se produce un error en la función, el valor devuelto es FALSE. Para obtener información de error extendida, llame a GetLastError.

Comentarios

GetLogicalProcessorInformation se puede usar para obtener información sobre la relación entre los procesadores lógicos del sistema, entre los que se incluyen:

  • Procesadores lógicos que forman parte de un nodo NUMA .
  • Procesadores lógicos que comparten recursos. Un ejemplo de este tipo de uso compartido de recursos sería escenarios de hiperthreading.
La aplicación puede usar esta información al establecer afinidad con los subprocesos y los procesos para aprovechar mejor las propiedades de hardware de la plataforma, o para determinar el número de procesadores lógicos y físicos con fines de licencia.

Cada una de las estructuras de SYSTEM_LOGICAL_PROCESSOR_INFORMATION devueltas en el búfer contiene lo siguiente:

  • Máscara de afinidad de procesador lógico, que indica a los procesadores lógicos a los que se aplica la información de la estructura.
  • Máscara de procesador lógico de tipo LOGICAL_PROCESSOR_RELATIONSHIP, que indica la relación entre los procesadores lógicos de la máscara. Las aplicaciones que llaman a esta función deben estar preparadas para controlar valores de indicador adicionales en el futuro.
Tenga en cuenta que el orden en el que se devuelven las estructuras en el búfer puede cambiar entre llamadas a esta función.

El tamaño de la estructura de SYSTEM_LOGICAL_PROCESSOR_INFORMATION varía entre las arquitecturas de procesador y las versiones de Windows. Por este motivo, las aplicaciones deben llamar primero a esta función para obtener el tamaño de búfer necesario y, a continuación, asignar dinámicamente memoria para el búfer.

En los sistemas con más de 64 procesadores lógicos, la función GetLogicalProcessorInformation recupera información de procesador lógico sobre los procesadores del grupo de procesadores al que está asignado actualmente el subproceso que realiza la llamada. Use la función GetLogicalProcessorInformationEx para recuperar información sobre los procesadores de todos los grupos de procesadores del sistema.

Nota

A partir de TBD Release Iron, el comportamiento de esta y otras funciones NUMA se ha modificado para admitir mejor los sistemas con nodos que contienen más de 64 procesadores. Para obtener más información sobre este cambio, incluida la información sobre cómo habilitar el comportamiento anterior de esta API, consulte Compatibilidad con NUMA.

Comportamiento a partir de TBD Release Iron

Las estructuras de relación de RelationNumaNode contienen la máscara de afinidad para la afinidad del nodo dentro del grupo del subproceso que llama.

Ejemplos

En el siguiente ejemplo de C++ se usa la función GetLogicalProcessorInformation para mostrar información sobre los procesadores en el sistema actual. Dado que GetLogicalProcessorInformation no está presente en todos los sistemas, en este ejemplo se usa la función GetProcAddress en lugar de llamar directamente a GetLogicalProcessorInformation .

En este ejemplo se informa del número de núcleos de procesador activos. En este ejemplo también se informa del número de nodos NUMA, paquetes físicos y memorias caché en sistemas que admiten esta información. Para obtener más información, vea la descripción del miembro Relationship de la estructura SYSTEM_LOGICAL_PROCESSOR_INFORMATION . Windows Server 2003, Windows XP Professional x64 Edition y Windows XP con SP3: En este ejemplo se informa del número de procesadores físicos en lugar del número de núcleos de procesador activos.


#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;
}


Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista, Windows XP Professional x64 Edition, Windows XP con SP3 [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado sysinfoapi.h
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

GetLogicalProcessorInformationEx

LOGICAL_PROCESSOR_RELATIONSHIP

Funciones de proceso y subproceso

SYSTEM_LOGICAL_PROCESSOR_INFORMATION