Функция GetLogicalProcessorInformation (sysinfoapi.h)
Извлекает сведения о логических процессорах и связанном оборудовании.
Чтобы получить сведения о логических процессорах и связанном оборудовании, включая группы процессоров, используйте функцию GetLogicalProcessorInformationEx .
Синтаксис
BOOL GetLogicalProcessorInformation(
[out] PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
[in, out] PDWORD ReturnedLength
);
Параметры
[out] Buffer
Указатель на буфер, получающий массив SYSTEM_LOGICAL_PROCESSOR_INFORMATION структур. Если функция завершается сбоем, содержимое этого буфера не определено.
[in, out] ReturnedLength
На входных данных указывает длину буфера, на который указывает buffer, в байтах. Если буфер достаточно велик, чтобы содержать все данные, эта функция выполняется успешно, и для параметра ReturnLength задано количество возвращаемых байтов. Если буфер недостаточно велик, чтобы вместить все данные, функция завершается ошибкой, GetLastError возвращает ERROR_INSUFFICIENT_BUFFER, а returnLength имеет длину буфера, необходимую для хранения всех данных. Если функция завершается ошибкой, отличной от ERROR_INSUFFICIENT_BUFFER, значение ReturnLength не определено.
Возвращаемое значение
Если функция выполнена успешно, возвращается значение TRUE, а в выходной буфер записывается по крайней мере одна структура SYSTEM_LOGICAL_PROCESSOR_INFORMATION .
Если функция завершается сбоем, возвращается значение FALSE. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
GetLogicalProcessorInformation можно использовать для получения сведений о связи между логическими процессорами в системе, в том числе:
- Логические процессоры, которые являются частью узла NUMA .
- Логические процессоры, которые совместно используют ресурсы. Примером такого общего доступа к ресурсам могут быть сценарии гиперпоточности.
Каждая из SYSTEM_LOGICAL_PROCESSOR_INFORMATION структур, возвращаемых в буфере, содержит следующее:
- Маска сходства логических процессоров, которая указывает логические процессоры, к которым применяется информация в структуре.
- Маска логического процессора типа LOGICAL_PROCESSOR_RELATIONSHIP, которая указывает на связь между логическими процессорами в маске. Приложения, вызывающие эту функцию, должны быть подготовлены к обработке дополнительных значений индикаторов в будущем.
Размер структуры SYSTEM_LOGICAL_PROCESSOR_INFORMATION зависит от архитектуры процессора и версий Windows. По этой причине приложения должны сначала вызвать эту функцию, чтобы получить необходимый размер буфера, а затем динамически выделить память для буфера.
В системах с более чем 64 логическими процессорами функция GetLogicalProcessorInformation извлекает сведения о логическом процессоре в группе процессоров , которой в настоящее время назначен вызывающий поток. Используйте функцию GetLogicalProcessorInformationEx для получения сведений о процессорах во всех группах процессоров в системе.
Примечание
Начиная с выпуска TBD, поведение этой и других функций NUMA было изменено для улучшения поддержки систем с узлами, содержащими более 64 процессоров. Дополнительные сведения об этом изменении, включая сведения о включении старого поведения этого API, см. в разделе Поддержка NUMA.
Поведение, начиная с выпуска tbd iron
Структуры связей для RelationNumaNode содержат маску сходства для сходства узла в группе вызывающего потока.
Примеры
В следующем примере C++ используется функция GetLogicalProcessorInformation для отображения сведений о процессорах в текущей системе. Так как GetLogicalProcessorInformation присутствует не во всех системах, в этом примере используется функция GetProcAddress вместо вызова GetLogicalProcessorInformation напрямую.
В этом примере сообщается количество активных ядер процессора. В этом примере также сообщается количество узлов NUMA, физических пакетов и кэшей в системах, поддерживающих эти сведения. Дополнительные сведения см. в описании элемента Relationship структуры SYSTEM_LOGICAL_PROCESSOR_INFORMATION . Windows Server 2003, Windows XP Professional x64 Edition и Windows XP с пакетом обновления 3 (SP3): В этом примере отображается количество физических процессоров, а не количество активных процессорных ядер.
#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;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista, Windows XP Professional x64 Edition, Windows XP с пакетом обновления 3 (SP3) [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | sysinfoapi.h |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |
См. также
GetLogicalProcessorInformationEx