如何通过PCIe总线读取使用的带宽?

时间:2010-09-21 09:47:50

标签: c++ windows memory pci-bus

我正在开发一种流媒体应用程序,可以在启动时将大量数据推送到显卡。 CPU在推送数据时做的很少,在接近零使用率的情况下闲置。

我想监控哪些机器在推送初始数据方面很挣扎,以及哪些机器可以应对,以便我能够为客户的硬件达到最低建议规格。

我发现具有PCIe 1.1 x16插槽的PC很难通过显卡推送初始数据。

我的开发PC有一个PCIe 2.0 x16插槽,它可以处理最初推送到显卡的大量数据。

我需要数字来证明(或反驳)我的观点。

我想要的是能够确定:

显卡上有哪种插槽类型? 那个插槽的速度是多少? Gfx卡名称 Gfx卡驱动版本

但最重要的是,数据流经PCIe插槽 - 例如如果我能证明PCIe总线的数据是最大的,我可以指出它是瓶颈。

我知道系统内存速度也是这里的一个因素,例如:数据从RAM传输,通过PCIe总线传输到显卡,那么还有办法确定系统内存速度吗?

最后,我使用非托管C ++编写,因此访问.NET库不是一种选择。

2 个答案:

答案 0 :(得分:1)

你是否在推送大量数据时遇到错误,或者你“只是”担心速度慢?

我怀疑是否有任何简单的方法来监控PCI-e带宽使用情况,如果可能的话。但是应该可以通过WMI和/或SetupAPI查询视频适配器所连接的总线类型 - 我没有个人经验或有用的链接,对不起。

答案 1 :(得分:1)

对于Nvidia GPU,您可以尝试使用NvAPI_GPU_GetDynamicPstatesInfoEx

  

Nvidia通过其GeForce驱动程序公开了一个编程接口   (" NVAPI")除其他外,允许收集性能   测量。对于技术倾向,这里是相关的   nvapi.h头文件中的部分:

     
    

功能名称:NvAPI_GPU_GetDynamicPstatesInfoEx

         

描述:此API检索NV_GPU_DYNAMIC_PSTATES_INFO_EX     指定物理GPU的结构。每个域的信息都是     索引在数组中。例如:

         
        
  • pDynamicPstatesInfo->利用率[NVAPI_GPU_UTILIZATION_DOMAIN_GPU]保存GPU域的信息。目前有四个域名     GPU利用率和动态P状态阈值可以是     检索:图形引擎(GPU),帧缓冲(FB),视频引擎     (VID)和总线接口(BUS)。
  •     
  
     

除了此标题评论之外,API的特定功能还不是   记录。以下信息是我们对它的最好解释   工作,虽然它依赖于很多猜想。

     
      
  • 图形引擎(" GPU")指标预计会成为大多数游戏的瓶颈。如果你没有看到或接近100%的东西   else(就像你的CPU或内存子系统一样)限制了性能。
  •   
  • 帧缓冲区(" FB")度量标准很有意思,如果它按预期工作。从名称来看,您希望它能够测量图形内存   利用率(使用的内存百分比)。这不是这个,   虽然。相反,它似乎是内存控制器的利用率   百分比。如果这是正确的,它将测量实际带宽   由控制器使用,否则不能用作   任何其他方式测量。
  •   
  • 我们对视频引擎不感兴趣(" VID");它通常不用于游戏,并且通常会注册0%的单位。你' d   如果您通过ShadowPlay或视频编码视频,则只能看到拨号移动   流入盾牌。
  •   
  • 总线接口(" BUS")指标再次以百分比形式表示PCIe控制器的利用率。相应的测量,   您可以在EVGA PrecisionX和MSI Afterburner中跟踪它   " GPU BUS使用"。
  •   
     

我们让Nvidia了解NVAPI的内部运作方式。它的   响应证实FB指标测量图形内存   带宽使用,但 Nvidia将BUS指标视为"考虑   不可靠,因此不在内部使用"

     

我们询问AMD是否有任何允许类似的API或功能   测量。经过内部验证,公司代表   确认他们没有。我们希望尽可能多   无法对AMD硬件进行类似测试。