2013-08-19 39 views
0

我一直在對一些CUDA程序(二維和三維格子玻爾茲曼求解器)進行基準測試,並且遇到了一些不尋常的事情;我希望隨着時間的推移,解算器的性能會出現一些隨機變化,但是會超過各種不同的問題大小,塊大小,OS和GPU(更不用說2D和3D代碼是完全獨立的,相同的程序)我可以看到內核執行時間非常明顯的正弦波動。對於我測試過的兩款GPU(K5000m和K20c),這種變化似乎在10-12Hz範圍內有一個頻率。CUDA內核性能的時間依賴性變化

對此有任何已知的解釋嗎?我的想法是熱量/電力管理,但我無法證明它。有沒有其他人經歷過這個?

進一步INFO和實施例

甲MSVC2010項目爲一個小例子代碼能夠在https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxtYXJram1hd3NvbnxneDplOWMwNWNhNDA4MmMwMjg的項目中找到需要CUDA 5.0和sm_30設備,雖然只有一個文件,以便構建項目手動將是微不足道。代碼相當自我解釋,100個簡單內核的迭代(內核從幾個數組中讀取,並寫入幾個數組默認執行)被計時並將其結果打印到一個文件中。執行執行時間的FFT可在K5000m上產生接近11Hz的可見峯值。我會張貼一張圖片,但我沒有聲望。

+0

執行時間變化的幅度是多少? – talonmies

+0

在10微秒的數量級上,我最初認爲這是使用cudaEvents的時間舍入誤差,但他們*應該*具有大約0.5微秒的分辨率。 – mjm26

+0

流體是否以正弦加速模式運動?在這樣的內核中有If-句子,並且性能隨條件變差而變化(完全隨機分支跨線程)和良好的(線程中有關於分支的順序) –

回答

1

Windows對GPU內核執行的詳細時間具有行爲影響,尤其是在WDDM模式下運行GPU時。請優先在Linux環境中重新運行觀察和FFT,其中X不在GPU上運行。這會給你最一致的行爲。 WDDM設置中的CUDA驅動程序在某種程度上受制於Windows操作系統。

我跑你的代碼SM35設備上的CentOS 5.5,CUDA 5.5,得到了以下Times.dat輸出:

0.007648 0.0024 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.00192 0.00192 0.001856 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.002016 0.001888 0.001888 0.00192 0.001952 0.001888 0.001888 0.001888 0.001888 0.00192 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001856 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00 1888 0.001888 0.001888 0.003904 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001856 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001952 0.001888 0.001888 0.00192 0.00192 0.00192 0.001888 0.001888 0.001952 0.001888 0.00192 0.001888 0.001856 0.001888 0.00192 0.001888 0.001888 0.001888 0.00192 0.001856 0.001888 0.001888 0.001888 0.001888 0.00192 0.00192 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.004448 0.001888 0.001952 0.001888 0.001888 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001856 0.0 01888 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888

有偶爾的變化但不要忘記你的cudaTime變量在毫秒捕獲時間。所以我在上面的數據中看到的變化大部分是小於1微秒變化的數量級,運行即可運行。

拋出第一個數字,我看到的最大變化在少數情況下大約爲2-3微秒。由於所測量的執行時間通常小於2微秒,這是一個很大的變化,但它仍然處於噪音之中,而不是像您所報告的10微秒。

對於我未經訓練的眼睛,我也沒有在數據中看到任何正弦波模式,但是如果您告訴我那裏有11Hz的頻率(甚至不確定是什麼意思,因爲這些數據點沒有時間標記我可以看到) - 我會聽你的。

+0

時間標記是通過總結先前迭代的執行時間得出的;它顯然不是精確的,因爲它忽略了對內核進行計時所花的時間,但是關心我的結果的一致性而不是確切的頻率。你的結果似乎沒有表現出這種行爲,我的印象是,我一直使用的K20c沒有使用x。也許我錯了,我會在該機器上運行我的樣本並確認。 – mjm26

+0

至於變化的順序,我不相信樣本會產生,因爲它是非常精簡的,旨在重現正弦行爲而不是幅度。 – mjm26