共计 2462 个字符,预计需要花费 7 分钟才能阅读完成。
1. 背景知识:理解 GPU 算力的核心指标
在开始查询算力之前,我们需要了解几个关键指标的含义:

-
TFLOPS(Tera Floating-Point Operations Per Second):表示显卡每秒能进行的浮点运算次数(万亿次),是衡量计算性能的核心指标。例如 910b4- 1 的标称算力为 256 TFLOPS(FP16)。
-
CUDA 核心数:NVIDIA 显卡的并行计算单元数量,直接影响并行任务处理能力。核心数越多,理论上并行计算能力越强。
-
显存带宽(Memory Bandwidth):显卡与显存之间的数据传输速率(GB/s),高带宽能减少数据等待时间。910b4- 1 通常配备 HBM2e 显存,带宽可达 1.8TB/s。
-
基础频率 / 加速频率:GPU 的运行时钟速度(MHz),直接影响算力发挥。
2. 查询方法对比
2.1 命令行工具
nvidia-smi(最常用)
nvidia-smi -q | grep -E "Product Name|FB Memory Usage|Utilization|GPU Operation Mode|Performance State"
关键字段说明:
– FB Memory Usage:显存使用情况
– Utilization:GPU 计算单元利用率
– Performance State:当前性能状态(P0 为最高)
deviceQuery(CUDA Samples)
需要先编译 CUDA Samples:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
make
./deviceQuery
输出示例:
Device 0: "NVIDIA 910b4-1"
CUDA Capability Major/Minor version number: 8.0
Total amount of global memory: 40.00 GB
(80) Multiprocessors, (128) CUDA Cores/MP
GPU Max Clock rate: 1410 MHz
2.2 编程接口
Python + PyCUDA 示例
import pycuda.driver as cuda
import pycuda.autoinit
def get_gpu_info():
try:
device = cuda.Device(0) # 默认第一张卡
attrs = device.get_attributes()
print(f"Device Name: {device.name()}")
print(f"Compute Capability: {device.compute_capability()}")
print(f"Total Memory: {device.total_memory()/1024**3:.2f} GB")
print(f"CUDA Cores: {attrs[pycuda.driver.device_attribute.MULTIPROCESSOR_COUNT] * 128}") # 假设每 MP 有 128 核心
# 计算理论 FP32 算力(TFLOPS)clock_rate = device.get_attribute(pycuda.driver.device_attribute.CLOCK_RATE) # kHz
mp_count = attrs[pycuda.driver.device_attribute.MULTIPROCESSOR_COUNT]
tflops = (mp_count * 128 * 2 * clock_rate * 1e-3) / 1e12 # 2 ops per FLMA
print(f"Theoretical FP32 TFLOPS: {tflops:.2f}")
except Exception as e:
print(f"Error: {str(e)}")
if __name__ == "__main__":
get_gpu_info()
3. 生产环境注意事项
多卡设备选择策略
- 使用
CUDA_VISIBLE_DEVICES环境变量指定可用 GPU:export CUDA_VISIBLE_DEVICES=0,2 # 只使用第 0 和第 2 号卡
算力波动常见原因
- 温度墙限制:GPU 温度超过阈值会自动降频
- 供电不足:检查电源功率是否达标
- PCIe 带宽瓶颈 :使用
nvidia-smi -q查看PCIe Link Width - 任务调度延迟 :使用
nvprof分析 kernel 执行时间
4. 进阶优化建议
CUDA 核函数配置原则
- 每个 Block 的线程数建议设为 32 的倍数(warp 大小)
- 共享内存大小根据算法需求精确设置
- 使用
__restrict__关键字减少指针别名分析开销
示例优化配置:
__global__ void optimized_kernel(float* input, float* output) {extern __shared__ float sdata[];
// ... 核函数实现
}
// 调用时指定共享内存大小
optimized_kernel<<<grid_size, block_size, shared_mem_size>>>(...);
5. 常见问题解答
Q:为什么实测算力低于标称值?
A:可能原因包括:
– 未启用 GPU 最高性能模式(nvidia-smi -pm 1)
– 存在其他进程占用资源
– 算法存在内存访问瓶颈
Q:如何验证算力测试结果准确性?
A:推荐使用标准测试工具:
git clone https://github.com/NVIDIA/cuda-samples
cd cuda-samples/Samples/matrixMul
make
./matrixMul -wA=1024 -hA=1024 -wB=1024 -hB=1024
动手实践任务
- 使用
nvidia-smi监控显卡在运行 ResNet50 时的实时利用率 - 修改 Python 示例代码,使其支持多 GPU 信息查询
- 尝试用
nvprof分析一个简单 CUDA 程序的瓶颈
提示:所有代码示例需在安装 CUDA Toolkit 和 PyCUDA 的环境下运行。遇到问题时,建议先检查驱动版本(
nvidia-smi -q | grep "Driver Version")与 CUDA 版本(nvcc --version)是否匹配。
