Skip to content

Commit 1b0ceeb

Browse files
committed
Added GPU clock information
1 parent 50612dc commit 1b0ceeb

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lup-system",
3-
"version": "1.5.4",
3+
"version": "1.5.5",
44
"description": "NodeJS library to retrieve system information and utilization.",
55
"main": "./lib/index",
66
"types": "./lib/index.d.ts",

src/gpu.ts

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
import { execCommand } from './utils';
22

33
export type GPUUtilization = {
4+
clockSpeed: {
5+
/** Current frequency of the graphics (shaders) clock in MHz. */
6+
graphics?: number;
7+
8+
/** Current frequency of the memory clock in MHz. */
9+
memory?: number;
10+
11+
/** Current frequency of the streaming multiprocessor clock in MHz. */
12+
sm?: number;
13+
14+
/** Current frequency of the video encoder/decoder clock in MHz. */
15+
video?: number;
16+
};
17+
418
/** GPU memory utilization as a percentage (0.0-1.0). */
519
memory?: number;
620

@@ -21,6 +35,18 @@ export type GPUUtilization = {
2135
};
2236

2337
export type GPU = {
38+
/** Maximum clock speed of the GPU. */
39+
clockMaxSpeed?: {
40+
/** Maximum frequency of the graphics (shaders) clock in MHz. */
41+
graphics?: number;
42+
43+
/** Maximum frequency of the memory clock in MHz. */
44+
memory?: number;
45+
46+
/** Maximum frequency of the streaming multiprocessor clock in MHz. */
47+
sm?: number;
48+
};
49+
2450
/** Unique ID of the GPU device. */
2551
id: string;
2652

@@ -128,14 +154,15 @@ export async function getGPUs(): Promise<GPU[]> {
128154
// nvidia-smi for more detailed info
129155
{
130156
const output = await execCommand(
131-
'nvidia-smi --query-gpu=name,display_attached,display_active,fan.speed,memory.total,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw --format=csv,nounits,noheader',
157+
'nvidia-smi --query-gpu=name,index,display_attached,display_active,fan.speed,memory.total,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw,clocks.current.graphics,clocks.current.sm,clocks.current.memory,clocks.current.memory,clocks.max.graphics,clocks.max.sm,clocks.max.memory --format=csv,nounits,noheader',
132158
).catch(() => '');
133159
const lines = output.split('\n').filter((line) => line.trim() !== '');
134160
const updatedIndexes = new Set<number>();
135161
// tslint:disable-next-line:prefer-for-of
136162
for (let i = 0; i < lines.length; i++) {
137163
const [
138164
name,
165+
index,
139166
displayAttached,
140167
displayActive,
141168
fanSpeed,
@@ -145,6 +172,13 @@ export async function getGPUs(): Promise<GPU[]> {
145172
temperatureGPU,
146173
temperatureMemory,
147174
powerDraw,
175+
clocksCurrentGraphics,
176+
clocksCurrentSM,
177+
clocksCurrentMemory,
178+
clocksCurrentVideo,
179+
clocksMaxGraphics,
180+
clocksMaxSM,
181+
clocksMaxMemory,
148182
] = lines[i].split(',').map((s) => s.trim());
149183
let currIdx = gpus.length;
150184
let currGpu: GPU | undefined = undefined;
@@ -162,6 +196,7 @@ export async function getGPUs(): Promise<GPU[]> {
162196
updatedIndexes.add(gpus.length);
163197
gpus.push(currGpu);
164198
}
199+
if (index.toString().length > 0) currGpu.index = parseInt(index, 10);
165200
if (displayAttached) currGpu.displayAttached = ['yes', 'enabled', '1'].includes(displayAttached.toLowerCase());
166201
if (displayActive) currGpu.displayActive = ['yes', 'enabled', '1'].includes(displayActive.toLowerCase());
167202
if (fanSpeed && !Number.isNaN(parseFloat(fanSpeed))) {
@@ -190,6 +225,38 @@ export async function getGPUs(): Promise<GPU[]> {
190225
if (!currGpu.utilization) currGpu.utilization = {} as GPUUtilization;
191226
currGpu.utilization.powerDraw = parseFloat(powerDraw);
192227
}
228+
if (clocksCurrentGraphics && !Number.isNaN(parseInt(clocksCurrentGraphics, 10))) {
229+
if (!currGpu.utilization) currGpu.utilization = {} as GPUUtilization;
230+
if (!currGpu.utilization.clockSpeed) currGpu.utilization.clockSpeed = {};
231+
currGpu.utilization.clockSpeed.graphics = parseInt(clocksCurrentGraphics, 10);
232+
}
233+
if (clocksCurrentMemory && !Number.isNaN(parseInt(clocksCurrentMemory, 10))) {
234+
if (!currGpu.utilization) currGpu.utilization = {} as GPUUtilization;
235+
if (!currGpu.utilization.clockSpeed) currGpu.utilization.clockSpeed = {};
236+
currGpu.utilization.clockSpeed.memory = parseInt(clocksCurrentMemory, 10);
237+
}
238+
if (clocksCurrentSM && !Number.isNaN(parseInt(clocksCurrentSM, 10))) {
239+
if (!currGpu.utilization) currGpu.utilization = {} as GPUUtilization;
240+
if (!currGpu.utilization.clockSpeed) currGpu.utilization.clockSpeed = {};
241+
currGpu.utilization.clockSpeed.sm = parseInt(clocksCurrentSM, 10);
242+
}
243+
if (clocksCurrentVideo && !Number.isNaN(parseInt(clocksCurrentVideo, 10))) {
244+
if (!currGpu.utilization) currGpu.utilization = {} as GPUUtilization;
245+
if (!currGpu.utilization.clockSpeed) currGpu.utilization.clockSpeed = {};
246+
currGpu.utilization.clockSpeed.video = parseInt(clocksCurrentVideo, 10);
247+
}
248+
if (clocksMaxGraphics && !Number.isNaN(parseInt(clocksMaxGraphics, 10))) {
249+
if (!currGpu.clockMaxSpeed) currGpu.clockMaxSpeed = {};
250+
currGpu.clockMaxSpeed.graphics = parseInt(clocksMaxGraphics, 10);
251+
}
252+
if (clocksMaxMemory && !Number.isNaN(parseInt(clocksMaxMemory, 10))) {
253+
if (!currGpu.clockMaxSpeed) currGpu.clockMaxSpeed = {};
254+
currGpu.clockMaxSpeed.memory = parseInt(clocksMaxMemory, 10);
255+
}
256+
if (clocksMaxSM && !Number.isNaN(parseInt(clocksMaxSM, 10))) {
257+
if (!currGpu.clockMaxSpeed) currGpu.clockMaxSpeed = {};
258+
currGpu.clockMaxSpeed.sm = parseInt(clocksMaxSM, 10);
259+
}
193260
gpus[currIdx] = currGpu;
194261
}
195262
}

0 commit comments

Comments
 (0)