【发布时间】:2015-01-19 20:45:04
【问题描述】:
clock() 和 clock64() 在 CUDA 中的时钟测量值是多少?
根据CUDA documentation,时钟是“每多处理器计数器”。根据我的理解,这是指主 GPU 时钟(而不是着色器时钟)。
但是当我使用主 GPU 时钟频率测量时钟计数并将其转换为时间值时,我得到的结果是实际值的两倍(我使用 cuda 事件从主机代码的内核执行时间测量实际值)。这表明clock() 返回着色器时钟频率而不是主 GPU 时钟。
我该如何解决这个困惑?
编辑: 我通过将我从 cudaGetDeviceProperties 获得的时钟频率除以 2 来计算主 GPU 时钟频率。据我了解,cudaGetDeviceProperties 给出的值是着色器时钟频率。
【问题讨论】:
-
主 GPU 时钟/图形核心时钟/图形时钟/核心时钟:流式多处理器运行的时钟频率。
着色器时钟/着色器核心时钟/处理器时钟/GPU时钟:执行单元(CUDA核心)运行的时钟频率。这是主 GPU 时钟值的两倍。我是这么理解的。 -
我可以确认在 Fermi 设备上,
cudaDeviceProp::clockRate是着色器时钟频率,即与“主”GPU 时钟相比的两倍值。在开普勒设备上,两者是相同的。如果您告诉您正在使用哪种设备,答案会更加确定。不确定clock()和clock64()- 你的假设可能是正确的。 -
我认为@Optimus 指的是以下内容:在较旧的 GPU(例如 Fermi 系列)上,执行单元的运行速度是图形域其余部分的两倍(有时称为“热时钟”)。
nvidia-smi分别将它们报告为“图形”和“SM”时钟。例如,在我的基于 Fermi 的 Quadro 2000 上,前者报告为 625 MHz,后者报告为 1251 MHz。据我所知,从 Kepler 开始,GPU 的所有非内存域都以相同的速度运行,即不再有 SM 热时钟。 -
我的设备是 Quadro 2000D。 'cudaDeviceProp::clockRate' 给出的时钟频率是 1251 MHz,这是着色器时钟频率。我感到困惑的原因是CUDA documentation 他们说“每多处理器计数器”指的是主 GPU 时钟。
-
@njuffa:你是如何获得 625 MHz 的?是来自数据表还是来自 CUDA 函数?