c++ - 如何读取 PCIe 总线上使用的带宽?

标签 c++ windows memory pci-bus

我正在开发一个在启动时将大量数据推送到显卡的流媒体应用程序。在推送数据时,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/

相关文章:

c++ - 尝试在排序后保持年龄/姓名对匹配

c++ - 如何创建派生自模板类和重载构造函数? C++

c++ - 在 OpenCV 中使用时间进行帧处理和其他任务

R Shiny 应用程序在不同操作系统中的兼容性?

azure - 为 Azure 应用服务创建进程转储

c++ - 重新分配给尚未准备好的 future 时会发生什么

windows - 使用bat脚本删除除一个文件循环外的所有文件

C# : how can I create User account remotely?

ios - CTRunDelegateRef iPhone 的内存管理

memory - 三.JS:纹理mipmaps和webGL的引用