2013-05-08 115 views
3

我有我在680gtx運行, 在測試我注意到,不同的編譯器選項的CUDA程序:CUDA計算能力1.0的速度比3.5

  • 編譯我的計算能力1.0和SM 1.0的代碼給出的47ms

  • 一個 運行時編譯的我的代碼爲計算能力3.5(還2.0)和SM 3.0給出了60ms的

一個 運行時

這可能是什麼原因導致的?

我正在編譯linux和CUDA 5.0上的nsight編譯器,我的內核主要是內存綁定。

謝謝。


的命令:

CC 1.0

nvcc --compile -O0 -Xptxas -v -gencode arch=compute_10,code=compute_10 -gencode arch=compute_10,code=sm_10 -keep -keep-dir /tmp/debug -lineinfo -pg -v -x cu -o "BenOlaCuda/src/main.o" "../BenOlaCuda/src/main.cu" 

CC 3.0

nvcc -lineinfo -pg -O0 -v -keep -keep-dir /tmp/debug -Xptxas -v -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -odir "BenOlaCuda/src" -M -o "BenOlaCuda/src/main.d" "../BenOlaCuda/src/main.cu" 

上編譯我的內核一些更多的信息:

立方厘米1.0

ptxas info : Compiling entry function '_Z15optimizePixelZ3tfPfS_S_S_tttttt' for 'sm_10' 
ptxas info : Used 40 registers, 68 bytes smem, 64 bytes cmem[1], 68 bytes lmem 

立方厘米3.0

ptxas info : Compiling entry function '_Z15optimizePixelZ3tfPfS_S_S_tttttt' for 'sm_30' 
ptxas info : Function properties for _Z15optimizePixelZ3tfPfS_S_S_tttttt 
128 bytes stack frame, 100 bytes spill stores, 108 bytes spill loads 
ptxas info : Used 63 registers, 380 bytes cmem[0], 20 bytes cmem[2] 
+0

'sm 1.0' vs'sm 3.5'的問題放在一邊,它可能是一個好主意,以避免溢出堆棧幀。也許刪除一些循環展開或類似的東西? – solvingPuzzles 2013-05-12 05:23:50

回答

7

大約兩年前,我將我的仿真從CUDA3.2切換到CUDA4.0,並且經歷了大約10%的性能降低。具有計算能力2.0 nVidia引入IEEE754-2008符合浮點計算(CC 1.0使用IEEE754-1985)。這一點以及「清零」的消除是導致性能下降的原因。嘗試使用編譯器標記--use_fast_math編譯您的CC 3.0可執行文件。這使得CC 1.0的舊精確性成爲可能。

+1

謝謝!這似乎解決了這個問題,現在這兩個內核具有可比較的性能。 事實上,當增加塊大小時,cc3.0的編譯速度似乎比預期快了約5%:) – BenMatok 2013-05-10 18:35:17

+0

CC 1.0中的「清零」是什麼? – Madhatter 2014-06-11 13:49:02

+0

@ Jeb11:看這裏http://stackoverflow.com/questions/2083550/flush-to-zero-behavior-in-floating-point-arithmetic – 2014-06-16 06:49:22

3

注意,680不能運行SM 3.5代碼 - 只有3.0。只有泰坦可以運行SM 3.5。

我對你所看到的區別兩種完全不同的解釋:

  1. 沒有GPU代碼實際上執行。如果您編譯「GPU」1.0(與「PTX」相反),則會發生這種情況。確保您檢查來自所有CUDA RT調用的錯誤值。
  2. 在一些極少數情況下,編譯爲PTX 1.0的代碼在將JIT編譯爲3.0之後運行得更快,然後將代碼直接編譯爲3.0。這是由用於發射GPU/PTX 1.0代碼和SM 2+代碼的不同編譯器引起的。請注意,在大多數情況下,由2+編譯器發出的代碼更快 - 但是有些代碼模式的報告相反。

更新

顯然,你的代碼需要大量的寄存器和編譯3.0分配更多的寄存器(因爲這種架構具有較高的寄存器號)限制佔用。

您可以嘗試使用塊大小和/或限制代碼使用的寄存器數量。沒有看到你的代碼和試用profiler就很難提出任何建議。我還建議您在CUDA toolkit 5.5可用時進行嘗試 - 編譯器可能會對您的代碼的性能進行不同的權衡。

+0

感謝您的回覆, (0)編譯器聲明支持cc 3.5,但這也發生在cc 2.x (1)計算給出了相同的結果,沒有錯誤。 (2)對於這種情況,性能差異似乎相當可觀,關於此問題的更多信息將有所幫助:) – BenMatok 2013-05-08 23:17:15

+1

編譯器是什麼意思?無論您的系統中是否安裝Titan或K20,編譯器都會讓您編譯3.5版本。如果您的意思是Nsight UI,那麼您可能選擇了與您的設備兼容的PTX 1.0。 – Eugene 2013-05-08 23:26:42

+1

回覆:2 - 我同意30%的性能影響似乎有點太大,因此我懷疑你根本沒有執行GPU代碼。您可以粘貼Make輸出以查看發出的編譯器命令。 – Eugene 2013-05-08 23:28:35

0

我正在處理同樣的問題。

看起來,cuda計算能力指數(1.0 2.0 2.1 3.0 3.5等)是cuda卡可以處理的操作類型的指標。 (請參閱:http://en.wikipedia.org/wiki/CUDA版本功能和規格,帶紅色和綠色表格的部分)。

另一件事是每個cuda卡的計算能力。這取決於gpus的數量和類型以及RAM的速度等。

因此,可能存在「僅」cuda 3.0卡,例如gtx-760,其中包含1152核心和cuda 3.0,並且可能存在另一個卡的GT 640,384核心,但CUDA 3.5)

唯一的代碼可能在兩個設備上進行比較,必須是3.0兼容,並可能會運行得更快GTX 760,儘管一個只有3.0和640 3.5

我認爲他們應該更清楚一點,計算能力指數並不是關於速度,而是大多數人的想法,但關於能力。