如何在 Linux 上访问 GPU 寄存器

Mic*_*ney 5 c linux gpu performancecounter performance-testing

我正在尝试访问 AMD HD7000 系列卡上的 GPU 寄存器。我在 GPU 上连接了传感器,可以测量功率输入和消耗。我想开发一个 Linux C++ 应用程序来访问 GPU 的性能计数器,以根据 GPU 事件/操作评估功耗。我熟悉 C 和 C++,但不熟悉操作系统,并且不确定从哪里开始执行此类任务。

我有一个 PDF。AMD 15h 系列型号 30h-3Fh 的 Bios 和内核开发人员指南位于此处: https://support.amd.com/TechDocs/49125_15h_Models_30h-3Fh_BKDG.pdf

在链接文档的第 106 页中,描述了性能计数器。计数器在开始计数之前必须通过控制寄存器进行设置。在第 715 页,更详细地定义了计数器。

本文档没有列出内存偏移量,所以我查了开源的AMD Linux 4.14.12驱动程序。在/drivers/gpu/drm/amd/amdgpu/sid.h第1256行下,我发现了一个性能计数器地址0x2688:

#define CB_PERFCOUNTER0_SELECT0     0x2688
Run Code Online (Sandbox Code Playgroud)

http://elixir.free-electrons.com/linux/v4.14.12/source/drivers/gpu/drm/amd/amdgpu/sid.h#L1256

另外,起始和停止计数器整数从第 1457 行开始:

#define PERFCOUNTER_START     (23 << 0)
#define PERFCOUNTER_STOP      (24 << 0)
Run Code Online (Sandbox Code Playgroud)

http://elixir.free-electrons.com/linux/v4.14.12/source/drivers/gpu/drm/amd/amdgpu/sid.h#L1457

我假设 CB_PERFCOUNTER 定义是相关地址,并且可以用作 GPU 寄存器内存位置的偏移量。我在互联网上搜索了很多,并且有很多资源,尽管我很难评估每个资源是否有任何相关信息或任何步骤如何适合整个流程。任何直接的解释或对材料的引用将不胜感激。