Skip to content

Commit c9a1765

Browse files
committed
GPU (Windows): support memory type detection for Intel dGPUs
1 parent cc246ea commit c9a1765

File tree

4 files changed

+97
-5
lines changed

4 files changed

+97
-5
lines changed

src/detection/gpu/gpu_driver_specific.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ typedef struct FFGpuDriverResult
4141
uint32_t* index;
4242
double* temp;
4343
FFGPUMemory* memory;
44+
FFstrbuf* memoryType;
45+
FFGPUMemory* sharedMemory;
4446
uint32_t* coreCount;
4547
double* coreUsage;
4648
FFGPUType* type;

src/detection/gpu/gpu_intel.c

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ struct FFIgclData {
1212
FF_LIBRARY_SYMBOL(ctlEnumTemperatureSensors)
1313
FF_LIBRARY_SYMBOL(ctlTemperatureGetState)
1414
FF_LIBRARY_SYMBOL(ctlEnumMemoryModules)
15+
FF_LIBRARY_SYMBOL(ctlMemoryGetProperties)
1516
FF_LIBRARY_SYMBOL(ctlMemoryGetState)
1617
FF_LIBRARY_SYMBOL(ctlEnumFrequencyDomains)
1718
FF_LIBRARY_SYMBOL(ctlFrequencyGetProperties)
@@ -42,6 +43,7 @@ const char* ffDetectIntelGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverRe
4243
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumTemperatureSensors)
4344
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlTemperatureGetState)
4445
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumMemoryModules)
46+
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlMemoryGetProperties)
4547
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlMemoryGetState)
4648
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumFrequencyDomains)
4749
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlFrequencyGetProperties)
@@ -135,14 +137,56 @@ const char* ffDetectIntelGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverRe
135137
result.memory->total = 0;
136138
for (uint32_t iMem = 0; iMem < memoryCount; iMem++)
137139
{
138-
ctl_mem_state_t memoryState = {
139-
.Size = sizeof(ctl_mem_state_t),
140+
ctl_mem_properties_t memoryProperties = {
141+
.Size = sizeof(memoryProperties),
140142
.Version = 0,
141143
};
142-
if (igclData.ffctlMemoryGetState(memoryModules[iMem], &memoryState) == CTL_RESULT_SUCCESS)
144+
if (igclData.ffctlMemoryGetProperties(memoryModules[iMem], &memoryProperties) == CTL_RESULT_SUCCESS)
143145
{
144-
result.memory->total += memoryState.size;
145-
result.memory->used += memoryState.size - memoryState.free;
146+
if (memoryProperties.location == CTL_MEM_LOC_DEVICE && result.memoryType)
147+
{
148+
switch (memoryProperties.type)
149+
{
150+
#define FF_ICTL_MEM_TYPE_CASE(type) case CTL_MEM_TYPE_##type: ffStrbufSetStatic(result.memoryType, #type); break
151+
FF_ICTL_MEM_TYPE_CASE(HBM);
152+
FF_ICTL_MEM_TYPE_CASE(DDR);
153+
FF_ICTL_MEM_TYPE_CASE(DDR3);
154+
FF_ICTL_MEM_TYPE_CASE(DDR4);
155+
FF_ICTL_MEM_TYPE_CASE(DDR5);
156+
FF_ICTL_MEM_TYPE_CASE(LPDDR);
157+
FF_ICTL_MEM_TYPE_CASE(LPDDR3);
158+
FF_ICTL_MEM_TYPE_CASE(LPDDR4);
159+
FF_ICTL_MEM_TYPE_CASE(LPDDR5);
160+
FF_ICTL_MEM_TYPE_CASE(GDDR4);
161+
FF_ICTL_MEM_TYPE_CASE(GDDR5);
162+
FF_ICTL_MEM_TYPE_CASE(GDDR5X);
163+
FF_ICTL_MEM_TYPE_CASE(GDDR6);
164+
FF_ICTL_MEM_TYPE_CASE(GDDR6X);
165+
FF_ICTL_MEM_TYPE_CASE(GDDR7);
166+
#undef FF_ICTL_MEM_TYPE_CASE
167+
default:
168+
ffStrbufSetF(result.memoryType, "Unknown (%u)", memoryProperties.type);
169+
break;
170+
}
171+
}
172+
173+
ctl_mem_state_t memoryState = {
174+
.Size = sizeof(ctl_mem_state_t),
175+
.Version = 0,
176+
};
177+
if (igclData.ffctlMemoryGetState(memoryModules[iMem], &memoryState) == CTL_RESULT_SUCCESS)
178+
{
179+
if (memoryProperties.location == CTL_MEM_LOC_DEVICE)
180+
{
181+
result.memory->total += memoryState.size;
182+
result.memory->used += memoryState.size - memoryState.free;
183+
}
184+
else if (result.sharedMemory && memoryProperties.location == CTL_MEM_LOC_SYSTEM)
185+
{
186+
result.sharedMemory->total += memoryState.size;
187+
result.sharedMemory->used += memoryState.size - memoryState.free;
188+
}
189+
}
146190
}
147191
}
148192
}

src/detection/gpu/gpu_windows.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist*
174174
.index = &gpu->index,
175175
.temp = options->temp ? &gpu->temperature : NULL,
176176
.memory = options->driverSpecific ? &gpu->dedicated : NULL,
177+
.sharedMemory = options->driverSpecific ? &gpu->shared : NULL,
178+
.memoryType = options->driverSpecific ? &gpu->memoryType : NULL,
177179
.coreCount = options->driverSpecific ? (uint32_t*) &gpu->coreCount : NULL,
178180
.coreUsage = options->driverSpecific ? &gpu->coreUsage : NULL,
179181
.type = &gpu->type,

src/detection/gpu/igcl.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,50 @@ typedef struct ctl_mem_state_t
141141
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv417ctlMemoryGetState16ctl_mem_handle_tP15ctl_mem_state_t
142142
extern ctl_result_t ctlMemoryGetState(ctl_mem_handle_t hMemory, ctl_mem_state_t *pState);
143143

144+
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv414ctl_mem_type_t
145+
typedef enum ctl_mem_type_t
146+
{
147+
CTL_MEM_TYPE_HBM = 0,
148+
CTL_MEM_TYPE_DDR = 1,
149+
CTL_MEM_TYPE_DDR3 = 2,
150+
CTL_MEM_TYPE_DDR4 = 3,
151+
CTL_MEM_TYPE_DDR5 = 4,
152+
CTL_MEM_TYPE_LPDDR = 5,
153+
CTL_MEM_TYPE_LPDDR3 = 6,
154+
CTL_MEM_TYPE_LPDDR4 = 7,
155+
CTL_MEM_TYPE_LPDDR5 = 8,
156+
CTL_MEM_TYPE_GDDR4 = 9,
157+
CTL_MEM_TYPE_GDDR5 = 10,
158+
CTL_MEM_TYPE_GDDR5X = 11,
159+
CTL_MEM_TYPE_GDDR6 = 12,
160+
CTL_MEM_TYPE_GDDR6X = 13,
161+
CTL_MEM_TYPE_GDDR7 = 14,
162+
CTL_MEM_TYPE_MAX
163+
} ctl_mem_type_t;
164+
165+
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv413ctl_mem_loc_t
166+
typedef enum ctl_mem_loc_t
167+
{
168+
CTL_MEM_LOC_SYSTEM = 0,
169+
CTL_MEM_LOC_DEVICE = 1,
170+
CTL_MEM_LOC_MAX
171+
} ctl_mem_loc_t;
172+
173+
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv420ctl_mem_properties_t
174+
typedef struct ctl_mem_properties_t
175+
{
176+
uint32_t Size;
177+
uint8_t Version;
178+
ctl_mem_type_t type;
179+
ctl_mem_loc_t location;
180+
uint64_t physicalSize;
181+
int32_t busWidth;
182+
int32_t numChannels;
183+
} ctl_mem_properties_t;
184+
185+
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv422ctlMemoryGetProperties16ctl_mem_handle_tP20ctl_mem_properties_t
186+
extern ctl_result_t ctlMemoryGetProperties(ctl_mem_handle_t hMemory, ctl_mem_properties_t *pProperties);
187+
144188
typedef struct ctl_freq_handle_t* ctl_freq_handle_t;
145189

146190
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#ctlenumfrequencydomains

0 commit comments

Comments
 (0)