From 6f0c11092b0a39265c6af723571906e4f834706d Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 31 五月 2019 16:50:20 +0800
Subject: [PATCH] add info

---
 gogpu.go |   80 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/gogpu.go b/gogpu.go
index a4eb39f..25f7c71 100644
--- a/gogpu.go
+++ b/gogpu.go
@@ -8,8 +8,88 @@
 #include "cgpu.h"
 */
 import "C"
+import (
+	"encoding/json"
+	"errors"
+	"strconv"
+	"strings"
+	"unsafe"
+)
 
 // IdleGPU pass needed gpu memory size test if satisfy
 func IdleGPU(memSize int) int {
 	return int(C.get_idle_gpu(C.int(memSize)))
 }
+
+// GpuUnitInfo gpu card info
+type GpuUnitInfo struct {
+	GpuUtilization int   `json:"utilization"`
+	GpuTemperature int   `json:"temperature"`
+	GpuDecoderUtil int   `json:"decoder"`
+	GpuEncoderUtil int   `json:"encoder"`
+	GpuProcesses   int   `json:"process"`
+	GpuMemoryTotal int64 `json:"memory"`
+	GpuMemoryFree  int64 `json:"free"`
+	GpuMemoryUsed  int64 `json:"used"`
+}
+
+func (u GpuUnitInfo) String() string {
+	s, _ := json.Marshal(u)
+	return string(s)
+}
+
+// GpuInfo gpu info
+type GpuInfo struct {
+	Count int           `json:"count"`
+	Info  []GpuUnitInfo `json:"info"`
+}
+
+func (g GpuInfo) String() string {
+	s, _ := json.Marshal(g)
+	return string(s)
+}
+
+// Info gpu infos
+func Info() (*GpuInfo, error) {
+
+	p := C.get_gpu_info()
+	if p == nil {
+		return nil, errors.New("can't get gpu infos")
+	}
+	defer C.free(unsafe.Pointer(p))
+
+	str := C.GoString(p)
+
+	infos := strings.Split(str, "|")
+
+	length := len(infos)
+
+	var units []GpuUnitInfo
+	var count int
+	for i := 0; i < length; i++ {
+		if infos[i] == "gpu" {
+			count++
+
+			i++
+			u := GpuUnitInfo{}
+			u.GpuUtilization, _ = strconv.Atoi(infos[i])
+			i++
+			u.GpuTemperature, _ = strconv.Atoi(infos[i])
+			i++
+			u.GpuDecoderUtil, _ = strconv.Atoi(infos[i])
+			i++
+			u.GpuEncoderUtil, _ = strconv.Atoi(infos[i])
+			i++
+			u.GpuProcesses, _ = strconv.Atoi(infos[i])
+			i++
+			u.GpuMemoryTotal, _ = strconv.ParseInt(infos[i], 10, 64)
+			i++
+			u.GpuMemoryFree, _ = strconv.ParseInt(infos[i], 10, 64)
+			i++
+			u.GpuMemoryUsed, _ = strconv.ParseInt(infos[i], 10, 64)
+			units = append(units, u)
+		}
+	}
+
+	return &GpuInfo{count, units}, nil
+}

--
Gitblit v1.8.0