package gogpu /* #cgo CFLAGS: -I. -w -g #cgo CXXFLAGS: -I. -std=c++11 -w -g #cgo LDFLAGS: -ldl #include #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 }