GPU (Windows): support memory type detection for Intel dGPUs

This commit is contained in:
李通洲
2025-03-24 15:22:26 +08:00
parent cc246ea239
commit c9a1765f29
4 changed files with 97 additions and 5 deletions
+2
View File
@@ -41,6 +41,8 @@ typedef struct FFGpuDriverResult
uint32_t* index;
double* temp;
FFGPUMemory* memory;
FFstrbuf* memoryType;
FFGPUMemory* sharedMemory;
uint32_t* coreCount;
double* coreUsage;
FFGPUType* type;
+49 -5
View File
@@ -12,6 +12,7 @@ struct FFIgclData {
FF_LIBRARY_SYMBOL(ctlEnumTemperatureSensors)
FF_LIBRARY_SYMBOL(ctlTemperatureGetState)
FF_LIBRARY_SYMBOL(ctlEnumMemoryModules)
FF_LIBRARY_SYMBOL(ctlMemoryGetProperties)
FF_LIBRARY_SYMBOL(ctlMemoryGetState)
FF_LIBRARY_SYMBOL(ctlEnumFrequencyDomains)
FF_LIBRARY_SYMBOL(ctlFrequencyGetProperties)
@@ -42,6 +43,7 @@ const char* ffDetectIntelGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverRe
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumTemperatureSensors)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlTemperatureGetState)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumMemoryModules)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlMemoryGetProperties)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlMemoryGetState)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumFrequencyDomains)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlFrequencyGetProperties)
@@ -135,14 +137,56 @@ const char* ffDetectIntelGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverRe
result.memory->total = 0;
for (uint32_t iMem = 0; iMem < memoryCount; iMem++)
{
ctl_mem_state_t memoryState = {
.Size = sizeof(ctl_mem_state_t),
ctl_mem_properties_t memoryProperties = {
.Size = sizeof(memoryProperties),
.Version = 0,
};
if (igclData.ffctlMemoryGetState(memoryModules[iMem], &memoryState) == CTL_RESULT_SUCCESS)
if (igclData.ffctlMemoryGetProperties(memoryModules[iMem], &memoryProperties) == CTL_RESULT_SUCCESS)
{
result.memory->total += memoryState.size;
result.memory->used += memoryState.size - memoryState.free;
if (memoryProperties.location == CTL_MEM_LOC_DEVICE && result.memoryType)
{
switch (memoryProperties.type)
{
#define FF_ICTL_MEM_TYPE_CASE(type) case CTL_MEM_TYPE_##type: ffStrbufSetStatic(result.memoryType, #type); break
FF_ICTL_MEM_TYPE_CASE(HBM);
FF_ICTL_MEM_TYPE_CASE(DDR);
FF_ICTL_MEM_TYPE_CASE(DDR3);
FF_ICTL_MEM_TYPE_CASE(DDR4);
FF_ICTL_MEM_TYPE_CASE(DDR5);
FF_ICTL_MEM_TYPE_CASE(LPDDR);
FF_ICTL_MEM_TYPE_CASE(LPDDR3);
FF_ICTL_MEM_TYPE_CASE(LPDDR4);
FF_ICTL_MEM_TYPE_CASE(LPDDR5);
FF_ICTL_MEM_TYPE_CASE(GDDR4);
FF_ICTL_MEM_TYPE_CASE(GDDR5);
FF_ICTL_MEM_TYPE_CASE(GDDR5X);
FF_ICTL_MEM_TYPE_CASE(GDDR6);
FF_ICTL_MEM_TYPE_CASE(GDDR6X);
FF_ICTL_MEM_TYPE_CASE(GDDR7);
#undef FF_ICTL_MEM_TYPE_CASE
default:
ffStrbufSetF(result.memoryType, "Unknown (%u)", memoryProperties.type);
break;
}
}
ctl_mem_state_t memoryState = {
.Size = sizeof(ctl_mem_state_t),
.Version = 0,
};
if (igclData.ffctlMemoryGetState(memoryModules[iMem], &memoryState) == CTL_RESULT_SUCCESS)
{
if (memoryProperties.location == CTL_MEM_LOC_DEVICE)
{
result.memory->total += memoryState.size;
result.memory->used += memoryState.size - memoryState.free;
}
else if (result.sharedMemory && memoryProperties.location == CTL_MEM_LOC_SYSTEM)
{
result.sharedMemory->total += memoryState.size;
result.sharedMemory->used += memoryState.size - memoryState.free;
}
}
}
}
}
+2
View File
@@ -174,6 +174,8 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist*
.index = &gpu->index,
.temp = options->temp ? &gpu->temperature : NULL,
.memory = options->driverSpecific ? &gpu->dedicated : NULL,
.sharedMemory = options->driverSpecific ? &gpu->shared : NULL,
.memoryType = options->driverSpecific ? &gpu->memoryType : NULL,
.coreCount = options->driverSpecific ? (uint32_t*) &gpu->coreCount : NULL,
.coreUsage = options->driverSpecific ? &gpu->coreUsage : NULL,
.type = &gpu->type,
+44
View File
@@ -141,6 +141,50 @@ typedef struct ctl_mem_state_t
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv417ctlMemoryGetState16ctl_mem_handle_tP15ctl_mem_state_t
extern ctl_result_t ctlMemoryGetState(ctl_mem_handle_t hMemory, ctl_mem_state_t *pState);
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv414ctl_mem_type_t
typedef enum ctl_mem_type_t
{
CTL_MEM_TYPE_HBM = 0,
CTL_MEM_TYPE_DDR = 1,
CTL_MEM_TYPE_DDR3 = 2,
CTL_MEM_TYPE_DDR4 = 3,
CTL_MEM_TYPE_DDR5 = 4,
CTL_MEM_TYPE_LPDDR = 5,
CTL_MEM_TYPE_LPDDR3 = 6,
CTL_MEM_TYPE_LPDDR4 = 7,
CTL_MEM_TYPE_LPDDR5 = 8,
CTL_MEM_TYPE_GDDR4 = 9,
CTL_MEM_TYPE_GDDR5 = 10,
CTL_MEM_TYPE_GDDR5X = 11,
CTL_MEM_TYPE_GDDR6 = 12,
CTL_MEM_TYPE_GDDR6X = 13,
CTL_MEM_TYPE_GDDR7 = 14,
CTL_MEM_TYPE_MAX
} ctl_mem_type_t;
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv413ctl_mem_loc_t
typedef enum ctl_mem_loc_t
{
CTL_MEM_LOC_SYSTEM = 0,
CTL_MEM_LOC_DEVICE = 1,
CTL_MEM_LOC_MAX
} ctl_mem_loc_t;
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv420ctl_mem_properties_t
typedef struct ctl_mem_properties_t
{
uint32_t Size;
uint8_t Version;
ctl_mem_type_t type;
ctl_mem_loc_t location;
uint64_t physicalSize;
int32_t busWidth;
int32_t numChannels;
} ctl_mem_properties_t;
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv422ctlMemoryGetProperties16ctl_mem_handle_tP20ctl_mem_properties_t
extern ctl_result_t ctlMemoryGetProperties(ctl_mem_handle_t hMemory, ctl_mem_properties_t *pProperties);
typedef struct ctl_freq_handle_t* ctl_freq_handle_t;
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#ctlenumfrequencydomains