Skip to content
This repository was archived by the owner on Apr 24, 2022. It is now read-only.

Hardware Monitoring for NVML, ADL and AMDGPU SysFS #319

Merged
merged 8 commits into from
Nov 27, 2017
63 changes: 58 additions & 5 deletions libhwmon/wrapadl.cpp
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "wraphelper.h"
#include "wrapadl.h"

@@ -35,7 +36,9 @@ wrap_adl_handle * wrap_adl_create()
/* 64-bit linux assumed */
#define libatiadlxx "libatiadlxx.so"
#else
#error "Unrecognized platform: need NVML DLL path for this platform..."
#define libatiadlxx ""
#warning "Unrecognized platform: need ADL DLL path for this platform..."
return NULL;
#endif

#if WIN32
@@ -59,17 +62,23 @@ wrap_adl_handle * wrap_adl_create()
wrap_dlsym(adlh->adl_dll, "ADL_Adapter_NumberOfAdapters_Get");
adlh->adlAdapterAdapterInfoGet = (wrap_adlReturn_t(*)(LPAdapterInfo, int))
wrap_dlsym(adlh->adl_dll, "ADL_Adapter_AdapterInfo_Get");
adlh->adlAdapterAdapterIdGet = (wrap_adlReturn_t(*)(int, int*))
wrap_dlsym(adlh->adl_dll, "ADL_Adapter_ID_Get");
adlh->adlOverdrive5TemperatureGet = (wrap_adlReturn_t(*)(int, int, ADLTemperature*))
wrap_dlsym(adlh->adl_dll, "ADL_Overdrive5_Temperature_Get");
adlh->adlOverdrive5FanSpeedGet = (wrap_adlReturn_t(*)(int, int, ADLFanSpeedValue*))
wrap_dlsym(adlh->adl_dll, "ADL_Overdrive5_FanSpeed_Get");
adlh->adlMainControlRefresh = (wrap_adlReturn_t(*)(void))
wrap_dlsym(adlh->adl_dll, "ADL_Main_Control_Refresh");
adlh->adlMainControlDestory = (wrap_adlReturn_t(*)(void))
wrap_dlsym(adlh->adl_dll, "ADL_Main_Control_Destroy");

if (adlh->adlMainControlCreate == NULL ||
adlh->adlMainControlDestory == NULL ||
adlh->adlMainControlRefresh == NULL ||
adlh->adlAdapterNumberOfAdapters == NULL ||
adlh->adlAdapterAdapterInfoGet == NULL ||
adlh->adlAdapterAdapterIdGet == NULL ||
adlh->adlOverdrive5TemperatureGet == NULL ||
adlh->adlOverdrive5FanSpeedGet == NULL
) {
@@ -82,8 +91,42 @@ wrap_adl_handle * wrap_adl_create()
}

adlh->adlMainControlCreate(ADL_Main_Memory_Alloc, 1);
adlh->adlAdapterNumberOfAdapters(&adlh->adl_gpucount);
adlh->devs = (wrap_adlDevice_t *)calloc(adlh->adl_gpucount, sizeof(wrap_adlDevice_t));
adlh->adlMainControlRefresh();

int logicalGpuCount = 0;
adlh->adlAdapterNumberOfAdapters(&logicalGpuCount);

adlh->phys_logi_device_id = (int*)calloc(logicalGpuCount, sizeof(int));

adlh->adl_gpucount = 0;
int last_adapter = 0;
if (logicalGpuCount > 0) {
adlh->devs = (LPAdapterInfo)malloc(sizeof(AdapterInfo) * logicalGpuCount);
memset(adlh->devs, '\0', sizeof(AdapterInfo) * logicalGpuCount);

adlh->devs->iSize = sizeof(adlh->devs);

int res = adlh->adlAdapterAdapterInfoGet(adlh->devs, sizeof(AdapterInfo) * logicalGpuCount);

for (int i = 0; i < logicalGpuCount; i++) {
int adapterIndex = adlh->devs[i].iAdapterIndex;
int adapterID = 0;

res = adlh->adlAdapterAdapterIdGet(adapterIndex, &adapterID);

if (res != WRAPADL_OK) {
continue;
}

adlh->phys_logi_device_id[adlh->adl_gpucount] = adapterIndex;

if (adapterID == last_adapter) {
continue;
}
last_adapter = adapterID;
adlh->adl_gpucount++;
}
}

return adlh;
}
@@ -102,14 +145,24 @@ int wrap_adl_get_gpucount(wrap_adl_handle *adlh, int *gpucount)
return 0;
}

int wrap_adl_get_gpu_name(wrap_adl_handle *adlh, int gpuindex, char *namebuf, int bufsize)
{
if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
return -1;

memcpy(namebuf, adlh->devs[adlh->phys_logi_device_id[gpuindex]].strAdapterName, bufsize);
return 0;
}


int wrap_adl_get_tempC(wrap_adl_handle *adlh, int gpuindex, unsigned int *tempC)
{
wrap_adlReturn_t rc;
if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
return -1;

ADLTemperature *temperature = new ADLTemperature();
rc = adlh->adlOverdrive5TemperatureGet(gpuindex, 0, temperature);
rc = adlh->adlOverdrive5TemperatureGet(adlh->phys_logi_device_id[gpuindex], 0, temperature);
if (rc != WRAPADL_OK) {
return -1;
}
@@ -126,7 +179,7 @@ int wrap_adl_get_fanpcnt(wrap_adl_handle *adlh, int gpuindex, unsigned int *fanp

ADLFanSpeedValue *fan = new ADLFanSpeedValue();
fan->iSpeedType = 1;
rc = adlh->adlOverdrive5FanSpeedGet(gpuindex, 0, fan);
rc = adlh->adlOverdrive5FanSpeedGet(adlh->phys_logi_device_id[gpuindex], 0, fan);
if (rc != WRAPADL_OK) {
return -1;
}
9 changes: 6 additions & 3 deletions libhwmon/wrapadl.h
Original file line number Diff line number Diff line change
@@ -15,8 +15,6 @@ typedef enum wrap_adlReturn_enum {
WRAPADL_OK= 0
} wrap_adlReturn_t;

typedef void * wrap_adlDevice_t;

// Some ADL defines and structs from adl sdk
#if defined (__MSC_VER)
#define ADL_API_CALL __cdecl
@@ -112,12 +110,15 @@ typedef struct ADLFanSpeedValue
typedef struct {
void *adl_dll;
int adl_gpucount;
wrap_adlDevice_t *devs;
int *phys_logi_device_id;
LPAdapterInfo devs;
wrap_adlReturn_t(*adlMainControlCreate)(ADL_MAIN_MALLOC_CALLBACK, int);
wrap_adlReturn_t(*adlAdapterNumberOfAdapters)(int *);
wrap_adlReturn_t(*adlAdapterAdapterInfoGet)(LPAdapterInfo, int);
wrap_adlReturn_t(*adlAdapterAdapterIdGet)(int, int*);
wrap_adlReturn_t(*adlOverdrive5TemperatureGet)(int, int, ADLTemperature*);
wrap_adlReturn_t(*adlOverdrive5FanSpeedGet)(int, int, ADLFanSpeedValue*);
wrap_adlReturn_t(*adlMainControlRefresh)(void);
wrap_adlReturn_t(*adlMainControlDestory)(void);
} wrap_adl_handle;

@@ -126,6 +127,8 @@ int wrap_adl_destory(wrap_adl_handle *adlh);

int wrap_adl_get_gpucount(wrap_adl_handle *adlh, int *gpucount);

int wrap_adl_get_gpu_name(wrap_adl_handle *adlh, int gpuindex, char *namebuf, int bufsize);

int wrap_adl_get_tempC(wrap_adl_handle *adlh, int gpuindex, unsigned int *tempC);

int wrap_adl_get_fanpcnt(wrap_adl_handle *adlh, int gpuindex, unsigned int *fanpcnt);
4 changes: 3 additions & 1 deletion libhwmon/wrapnvml.cpp
Original file line number Diff line number Diff line change
@@ -52,7 +52,9 @@ wrap_nvml_handle * wrap_nvml_create() {
/* 64-bit linux assumed */
#define libnvidia_ml "libnvidia-ml.so"
#else
#error "Unrecognized platform: need NVML DLL path for this platform..."
#define libnvidia_ml ""
#warning "Unrecognized platform: need NVML DLL path for this platform..."
return NULL;
#endif

#if WIN32