我正在开发一个在启动时将大量数据推送到显卡的流媒体应用程序。在推送数据时,CPU 几乎没有做任何事情,它以接近零的使用率闲置。
我想监控哪些机器在推送初始数据时遇到困难,哪些机器可以应付,以便我可以为我们的客户硬件获得最低推荐规范。
我发现带有 PCIe 1.1 x16 插槽的 PC 难以处理通过显卡推送的初始数据。
我的开发 PC 有一个 PCIe 2.0 x16 插槽,它可以毫无问题地处理最初推送到显卡的大量数据。
我需要数字来证明(或反驳)我的观点。
我想要的是能够确定:
显卡在哪个插槽类型上? 那个插槽的速度是多少? Gfx卡名称 Gfx卡驱动版本
但最重要的是,数据流经 PCIe 插槽 - 例如如果我可以证明 PCIe 总线的数据已达到极限,我可以指出这是瓶颈。
我知道系统内存速度也是一个因素,例如数据通过 PCIe 总线从 RAM 传输到显卡,那么有没有办法也确定系统内存速度?
最后,我使用非托管 C++ 编写,因此无法访问 .NET 库。
最佳答案
对于 Nvidia GPU,您可以尝试使用 NvAPI_GPU_GetDynamicPstatesInfoEx
:
Nvidia, through its GeForce driver, exposes a programming interface ("NVAPI") that, among other things, allows for collecting performance measurements. For the technically inclined, here is the relevant section in the nvapi.h header file:
FUNCTION NAME: NvAPI_GPU_GetDynamicPstatesInfoEx
DESCRIPTION: This API retrieves the NV_GPU_DYNAMIC_PSTATES_INFO_EX structure for the specified physical GPU. Each domain's info is indexed in the array. For example:
- pDynamicPstatesInfo->utilization[NVAPI_GPU_UTILIZATION_DOMAIN_GPU] holds the info for the GPU domain. There are currently four domains for which GPU utilization and dynamic P-state thresholds can be retrieved: graphic engine (GPU), frame buffer (FB), video engine (VID), and bus interface (BUS).
除了这个标题注释之外,API 的特定功能不是 记录在案。以下信息是我们对其的最佳解读 工作原理,尽管它依赖于很多猜想。
- 图形引擎(“GPU”)指标预计将成为大多数游戏的瓶颈。如果您没有在 100% 或接近 100% 的情况下看到它,有些东西 否则(例如您的 CPU 或内存子系统)会限制性能。
- 帧缓冲区(“FB”)指标很有趣,如果它按预期工作的话。从名字上看,你会期望它测量显存 利用率(已用内存的百分比)。这不是这个, 尽管。相反,它似乎是内存 Controller 的利用率 百分比。如果那是正确的,它将测量实际带宽 由 Controller 使用,它不能以其他方式作为 任何其他方式的测量。
- 我们对视频引擎(“VID”)没那么感兴趣;它通常不用于游戏,通常记录为 0%。你 如果您通过 ShadowPlay 编码视频或 流式传输到 Shield。
- 总线接口(interface)(“BUS”)指标是指 PCIe Controller 的利用率,再次以百分比表示。相应的测量, 您可以在 EVGA PrecisionX 和 MSI Afterburner 中追踪,称为 “GPU 总线使用”。
我们要求 Nvidia 阐明 NVAPI 的内部工作原理。它的 响应确认 FB 指标测量图形内存 带宽使用,但 Nvidia 将 BUS 指标视为“考虑 不可靠,因此不在内部使用。”
我们询问 AMD 是否有任何 API 或功能允许类似的 测量。经过内部核实,公司代表 确认他们没有。只要我们愿意,我们就是 无法在 AMD 硬件上进行类似测试。
关于c++ - 如何读取 PCIe 总线上使用的带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759079/