2014-11-21 30 views
1

CUDA中的clock()clock64()的时钟测量是什么?CUDA中clock()和clock64()的时钟测量是什么?

根据CUDA documentation该时钟是'per-multiprocessor counter'。根据我的理解,这是指主GPU时钟(不是着色器时钟)。

但是,当我测量时钟计数并将其转换为使用主GPU时钟频率的时间值时,我得到的结果是真实值的两倍大(我使用内核执行时间从使用cuda事件的主机代码测量实际值) 。这表明clock()返回着色器时钟频率,而不是主要的GPU时钟。

我该如何解决这个困惑?

编辑: 我通过将我从cudaGetDeviceProperties获得的时钟频率除以2来计算主GPU时钟频率。据我所知,cudaGetDeviceProperties给出的值是着色器时钟频率。

+0

**主要GPU时钟/图形核心时钟/图形时钟/核心时钟**:流式多处理器运行的时钟频率。
**着色器时钟/着色器核心时钟/处理器时钟/ GPU时钟**:执行单元(CUDA内核)运行的时钟速率。这是主要GPU时钟的两倍。 这就是我对它的理解。 – Optimus 2014-11-21 16:37:40

+1

我可以确认,在费米设备上,'cudaDeviceProp :: clockRate'是着色器时钟频率,即与“主”GPU时钟相比的双倍值。在开普勒设备上,两者是相同的。如果你知道你正在使用哪种设备,答案会更加确定。不知道'clock()'和'clock64()' - 你可能是对的。 – 2014-11-21 16:47:19

+1

我认为@Optimus指的是以下内容:在较早的GPU(例如Fermi系列)上,执行单元的运行速度是图形域其余部分的两倍时钟速率(有时被称为“热时钟”)。 'nvidia-smi'分别报告为“图形”和“SM”时钟。例如,在我的基于费米的Quadro 2000上,前者报告为625 MHz,后者报告为1251 MHz。最好的我知道,从开普勒开始,GPU的所有非内存区域都以相同的速度运行,即没有更多的SM热时钟。 – njuffa 2014-11-21 16:53:32

回答

2

确实,CUDA documentation表示clock()clock64()返回'per-multiprocessor counter'。但在费米架构中,clock()clock64()实际返回的是着色器时钟计数器。

cudaGetDeviceProperties返回的clockRate是着色器时钟频率。

所以要计算时间,我们必须将您的时钟频率从clock()clock64()除以您从cudaGetDeviceProperties得到的着色器时钟频率。

+3

我会根据'cudaDeviceProp :: clockRate'的值将'clock()'或'clock64()'计数转换为时间单位,因为由于时钟提升和时钟调节,底层时钟可以动态改变。如果我没有记错的话,自费米以来,时钟节流以抑制功耗,并且开普勒引入了动态时钟提升。 – njuffa 2014-11-21 17:57:12

+0

是的,我同意你的看法。但在我的情况下,我得到的价值是准确的。我将'clock()'得到的结果与我从CUDA事件得到的时间测量结果进行了比较,结果几乎相似。 – Optimus 2014-11-22 10:30:14