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 --- cgpu.cpp | 6 + gogpu.go | 80 ++++++++++++++++++++++++++ gpu/info.cpp | 58 ++++++++++++++++++ cgpu.h | 2 gpu/info.h | 3 5 files changed, 145 insertions(+), 4 deletions(-) diff --git a/cgpu.cpp b/cgpu.cpp index cc9c2ef..80421f4 100644 --- a/cgpu.cpp +++ b/cgpu.cpp @@ -12,5 +12,9 @@ #include "gpu/info.cpp" int get_idle_gpu(const int mem_size){ - return gpu::getGPU(mem_size); + return gpu::getIdleGPU(mem_size); +} + +char* get_gpu_info(){ + return gpu::getGpuInfo(); } \ No newline at end of file diff --git a/cgpu.h b/cgpu.h index 4d26109..bd268ea 100644 --- a/cgpu.h +++ b/cgpu.h @@ -7,6 +7,8 @@ int get_idle_gpu(const int mem_size); +char* get_gpu_info(); + #ifdef __cplusplus } #endif 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 +} diff --git a/gpu/info.cpp b/gpu/info.cpp index d38a8ae..f387ef2 100644 --- a/gpu/info.cpp +++ b/gpu/info.cpp @@ -301,7 +301,7 @@ goto gpu_fail; } - if(process_buf_size >= 0){ + if(process_buf_size > 0){ infos->devices[i].running_processes = process_buf_size; } @@ -369,7 +369,7 @@ return suitable_gpu; } -int getGPU(const int need){ +int getIdleGPU(const int need){ nvGpuInfo_t gpu_buf; int ret = get_gpu_info(&gpu_buf); @@ -381,6 +381,60 @@ return -1; } + + // unsigned int decoder_utilization; + // unsigned int encoder_utilization; + // unsigned int gpu_utilization; + // unsigned int memory_utilization; + // unsigned int temperature; + // unsigned int running_processes; + + // unsigned long long memory_total; + // unsigned long long memory_free; + // unsigned long long memory_used; + +char *getGpuInfo(){ + + nvGpuInfo_t gpu_info; + int flag = get_gpu_info(&gpu_info); + + char * ret= NULL; + + if(!flag){ + + char f[] = "gpu"; + char s[] = "|"; + + ret = (char*)malloc(1024 * gpu_info.device_count); + int len = 0; + + char tmp[1024]; + + for(int i = 0; i < gpu_info.device_count; i++){ + memset(tmp, 0, 1024); + + nvGpuUnitInfo_t g = gpu_info.devices[i]; + sprintf(tmp, "%s%s%d%s%d%s%d%s%d%s%d%s%llu%s%llu%s%llu%s", + f,s, + g.gpu_utilization,s, + g.temperature,s, + g.decoder_utilization,s, + g.encoder_utilization,s, + g.running_processes,s, + g.memory_total,s, + g.memory_free,s, + g.memory_used,s); + + int l = strlen(tmp); + memcpy(ret+len, tmp, l); + len += l; + } + ret[len] = '\0'; + } + + return ret; +} + int test(void) { nvGpuInfo_t gpu_buf; diff --git a/gpu/info.h b/gpu/info.h index 73da8ab..2595f9f 100644 --- a/gpu/info.h +++ b/gpu/info.h @@ -2,7 +2,8 @@ #define _nvidia_gpu_info_h_ namespace gpu{ - int getGPU(const int need); + int getIdleGPU(const int need); + char *getGpuInfo(); } #endif \ No newline at end of file -- Gitblit v1.8.0