Разобрался с помощью коллег из https://t.me/fmx_flood, спасибо kami!
Определение:
nvmlDeviceGetHandleByPciBusId_v2 : function (const pciBusId : PAnsiChar; pHandle: p_nvmlDevice_t) : nvmlReturn_t; stdcall;
Импорт:
function ProcNV(var Fun: Pointer; const FunName: WideString) : boolean;
begin
Fun := nil;
Fun := GetProcAddress(LibHandleNV, PWideChar(FunName));
Result := Assigned(Fun);
end;
...
ProcNV(@nvmlDeviceGetHandleByPciBusId_v2, 'nvmlDeviceGetHandleByPciBusId_v2');
Использование:
В функцию GPUusageNVIDIA надо вместо GPU ID передавать PCI BUS ID.
PCI BUS ID получаем так
clStatus := clGetDeviceInfo(PlatformDevices[DevN], CL_DEVICE_PCI_BUS_ID_NV, SizeOf(AValueCardinal), @AValueCardinal, @Returned_Size);
if (clStatus = CL_SUCCESS) and (Returned_Size = 4) then
ADevicesOpenCL[NumDevicesOpenCL].DevicePCIBusID := AValueCardinal;
Ну и получение GPU_Handle :
var
ABusIDText : String;
...
ABusIDText := '00000000:' + PCIBusID.ToString.PadLeft(2, '0') + ':00.0';
AnvmlReturn := nvmlDeviceGetHandleByPciBusId_v2(PAnsiChar(AnsiString(ABusIDText)), @GPU_Handle);
If AnvmlReturn <> 0 then
raise EAbort.Create('');
В nvmlDeviceGetHandleByPciBusId_v2 передается pciBusId, параметр должен быть вида domain:bus:device.function, к примеру '00000000:08:00.0'