GPU性能测试工具Perftest使用指南
项目概述
Perftest是一款专业的GPU着色器内存操作性能测试工具,基于DirectX 11.0实现。该工具的主要目的不是对不同品牌的GPU进行基准测试对比,而是帮助渲染程序员在优化计算着色器性能时选择合适的资源类型。
核心功能特色
多维度内存加载测试
- 合并加载(100% L1缓存命中)
- 随机加载(100% L1缓存命中)
- 统一地址加载(所有线程使用相同地址)
全面资源类型支持
- 类型化缓冲区SRV:1/2/4通道,8/16/32位每通道
- 字节地址缓冲区SRV:load、load2、load3、load4 - 对齐和非对齐
- 结构化缓冲区SRV:float/float2/float4
- 常量缓冲区float4数组索引加载
- Texture2D加载:1/2/4通道,8/16/32位每通道
- Texture2D最近采样:1/2/4通道,8/16/32位每通道
- Texture2D双线性采样:1/2/4通道,8/16/32位每通道
快速启动指南
环境准备
确保您的系统满足以下要求:
- Windows操作系统
- 支持DirectX 11.0的GPU
- Visual Studio开发环境
项目构建
第一步:获取项目源码
git clone https://gitcode.com/gh_mirrors/pe/perftest
cd perftest
第二步:使用Visual Studio打开项目
打开perftest.sln解决方案文件
配置适当的构建目标(Debug/Release)
构建项目生成可执行文件
第三步:运行性能测试
Perftest.exe [适配器索引]
测试模式说明
合并加载模式 GPU优化线性地址模式。当warp/wave(32/64线程)中的所有线程从连续地址加载时会发生合并。在"线性"测试用例中,内存加载访问整个线程组(256线程)中的连续地址。
随机加载模式 为每个线程添加0-15个元素的随机起始偏移(仍然对齐)。这可以防止GPU合并,并为常见情况(非线性)内存访问提供更真实的性能视图。
统一加载模式 组中的所有线程同时从相同地址加载。这会在某些GPU上触发合并路径,并在某些GPU上触发额外优化。
技术实现原理
编译器优化防护
编译器优化可能会破坏结果。我们希望仅测量加载(读取)性能,但写入(存储)也是必需的,否则编译器将优化整个着色器。为避免这种情况,每个线程首先执行256次加载,然后执行单个线性组共享内存写入(无存储体冲突)。
测试架构设计
应用程序旨在测量L1缓存内的峰值数据加载性能。所有测试都在GPU的L1缓存内操作(工作集不超过16 KB)。
性能分析要点
AMD GCN架构特点
在AMD GCN架构上,类型化加载、原始加载、纹理加载等都有特定的性能模式。例如,在GCN2架构上:
- 类型化加载:GCN合并线性类型化加载,但仅1d加载(R8、R16F、R32F)。合并加载性能为4倍。
- 原始加载:类似于类型化加载。1d原始加载在线性访问上完美合并(4倍)。统一地址原始加载在GCN上生成标量单元加载。
- 纹理加载:性能类似于类型化缓冲区加载。
NVIDIA架构特点
在NVIDIA架构上:
- 类型化加载:Maxwell不合并任何类型化加载。所有高达64位的加载都是全速率,128位加载是半速率。
最佳实践建议
资源选择策略
AMD平台建议
- 优先选择宽4d加载而不是多个窄加载
- 如果您有完美的线性内存访问模式,1d合并加载也很快
- 字节地址缓冲区(原始加载)具有良好的性能
NVIDIA平台建议
- 优先选择64+位类型化加载
- 统一地址加载(在循环中使用循环索引)有快速路径。尽可能使用它。
测试配置优化
- 设置适当的预热帧数和基准测试帧数
- 选择合适的线程组大小和工作负载配置
- 监控系统资源使用情况
应用场景分析
游戏开发优化
在游戏开发中,Perftest可以帮助开发者:
- 识别GPU内存访问瓶颈
- 优化计算着色器性能
- 选择最适合特定硬件的内存访问模式
图形渲染研究
对于图形渲染研究人员,该工具提供了:
- 不同GPU架构的性能对比
- 内存访问模式的深入分析
- 编译器优化行为的理解
注意事项
测试环境要求
- 确保测试环境稳定,避免其他应用程序干扰
- 使用最新的GPU驱动程序
- 在测试期间监控GPU温度和功耗
结果解读指南
- 所有结果都与同一GPU上的
Buffer<RGBA8>.Load random结果(=1.0x)进行比较。
通过Perftest工具,开发者可以更好地理解市场上各种GPU硬件,并获得优化代码的洞察力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



