2014-11-21 58 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