From 4b559e8b20d48e3b35e0636217fb0e50a995eeb9 Mon Sep 17 00:00:00 2001 From: Kolan Sh Date: Tue, 11 Oct 2016 15:25:52 +0300 Subject: [PATCH] Do not parse all nvidia-smi output, use --query-gpu option. --- src/sysdeps/linux.c | 68 ++++++++++----------------------------------- 1 file changed, 15 insertions(+), 53 deletions(-) diff --git a/src/sysdeps/linux.c b/src/sysdeps/linux.c index f1c54d4..71c1479 100644 --- a/src/sysdeps/linux.c +++ b/src/sysdeps/linux.c @@ -3084,7 +3084,7 @@ static gboolean sensors_nvidia_smi_read(gboolean setup) { gint n = 0; - gchar *args[] = { "nvidia-smi", "-q", "-a", NULL }; + gchar *args[] = { "nvidia-smi", "--format=csv", "--query-gpu=temperature.gpu", NULL }; gchar *str, *stmp, id[64]; gchar *output = NULL; gchar *errout = NULL; @@ -3109,61 +3109,23 @@ sensors_nvidia_smi_read(gboolean setup) if (result && output) { str = output; - /* Look for GPU N: or GPU X:Y:Z sections, but avoid GPU : lines - | Recent nvidia-smi output looks like (eg 270.41.06): - | - | GPU 0:3:0 - | Product Name : GeForce GTX 460 - | ... - | Temperature - | Gpu : 32 C - | - | Older nvidia-smi output was like (eg 260.19.29): - | - | GPU 0: - | Product Name : GeForce GTX 285 - | ... - | Temperature : 65 C - | Fan Speed : 100% - | Utilization - | GPU : 84% - | ... - */ - while ((str = g_strstr_len(str, -1, "GPU ")) != NULL) + /* nvidia-smi --format=csv --query-gpu=temperature.gpu: + * temperature.gpu + * 52 + */ + if (sscanf(str, "temperature.gpu\n%f", &temp) == 1) { - str += 3; - if ( sscanf(str, " %63s", id) != 1 - || !strcmp(id, ":") - ) - continue; - if ((str = g_strstr_len(str, -1, "Temperature")) != NULL) + if (setup) { - str += 11; - if (sscanf(str, " : %f", &temp) != 1) - { - stmp = str; - str = g_strstr_len(str, -1, "GPU Current Temp"); - if (!str) - { - str = stmp; - continue; - } - str += 27; - if (sscanf(str, " : %f", &temp) != 1) - continue; - } - if (setup) - { - smi = g_new0(NvidiaSmi, 1); - smi->id = g_strdup(id); - smi->temp = temp; - nvidia_smi_list = g_list_append(nvidia_smi_list, smi); - sensors_nvidia_smi_add(smi); - ++n; - } - else if ((smi = nvidia_smi_lookup(id)) != NULL) - smi->temp = temp; + smi = g_new0(NvidiaSmi, 1); + smi->id = g_strdup(id); + smi->temp = temp; + nvidia_smi_list = g_list_append(nvidia_smi_list, smi); + sensors_nvidia_smi_add(smi); + ++n; } + else if ((smi = nvidia_smi_lookup(id)) != NULL) + smi->temp = temp; } } if (output)