You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++程序中提取nvidia-smi输出的GPU电压数值?

提取nvidia-smi输出中数值的C++实现方法

第一步:捕获命令的输出内容

C++中无法直接通过console()获取命令输出,建议使用popen()函数执行外部命令并读取其输出流。示例代码如下:

#include <iostream>
#include <string>
#include <cstdio>

std::string executeCommand(const char* cmd) {
    char buffer[128];
    std::string result = "";
    FILE* pipe = popen(cmd, "r");
    if (!pipe) {
        return "Error: Failed to execute command";
    }
    while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
        result += buffer;
    }
    pclose(pipe);
    return result;
}

调用这个函数就能获取nvidia-smi -q -i 0(注:原命令-i voltage有误,-i参数后应跟GPU索引,比如0)的完整输出内容。

第二步:从输出中提取目标数值

方法1:使用正则表达式(通用且简洁)

C++11及以上版本支持<regex>库,通过匹配包含数字和小数点的模式,可轻松提取数值。以提取电压为例:

#include <regex>
#include <vector>

std::vector<std::string> extractNumbers(const std::string& input) {
    std::vector<std::string> numbers;
    std::regex numRegex(R"(\d+\.\d+)"); // 匹配带小数点的数值,如需整数可调整为\d+
    std::sregex_iterator it(input.begin(), input.end(), numRegex);
    std::sregex_iterator end;

    for (; it != end; ++it) {
        numbers.push_back((*it).str());
    }
    return numbers;
}

// 使用示例
int main() {
    std::string output = executeCommand("nvidia-smi -q -i 0 | grep -A 5 \"Voltage\"");
    std::vector<std::string> voltages = extractNumbers(output);
    if (!voltages.empty()) {
        std::cout << "GPU当前电压:" << voltages[0] << " mV" << std::endl;
    }
    return 0;
}

这个方法适用于所有类似场景,只要调整正则表达式的匹配模式(比如匹配整数、带单位的数值等),就能提取其他命令输出中的数字。

方法2:逐字符解析(无需依赖正则库)

如果环境不支持C++11正则,也可以手动遍历字符串,筛选出数字和小数点:

std::string extractFirstNumber(const std::string& input) {
    std::string number;
    bool hasDecimal = false;
    for (char c : input) {
        if (isdigit(c)) {
            number += c;
        } else if (c == '.' && !hasDecimal) {
            number += c;
            hasDecimal = true;
        } else if (!number.empty()) {
            // 遇到非数字且已开始匹配,提前结束
            break;
        }
    }
    return number;
}

// 使用示例
int main() {
    std::string output = executeCommand("nvidia-smi -q -i 0 | grep \"Graphics Voltage\"");
    std::string voltage = extractFirstNumber(output);
    std::cout << "GPU当前电压:" << voltage << " mV" << std::endl;
    return 0;
}

这个方法通过逐字符判断,提取第一个连续的数值字符串,适合格式固定的输出场景。

注意事项

  • 确保nvidia-smi命令路径正确,Windows环境下可能需要指定完整路径(比如C:\\Program Files\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe)。
  • 可结合grep(Linux/macOS)或findstr(Windows)命令缩小输出范围,减少解析工作量。

内容的提问来源于stack exchange,提问作者JackDerke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:45:37