2015-10-06 16 views
2

我期待到CUDA頭文件cuda/6.5.14/RHEL6.x/include/math_functions_dbl_ptx1.h和看到每一個算術函數,接受double參數鑄就成floatCUDA是否靜靜地向下翻兩倍以浮動?

static __forceinline__ double fabs(double a) 
{ 
    return (double)fabsf((float)a); 
} 

... 

static __forceinline__ double floor(double a) 
{ 
    return (double)floorf((float)a); 
} 

因爲我依靠的重要途徑上雙精度浮點(有相當代碼中幾乎沒有潛在的災難性取消)我相信自己的眼睛有一些麻煩。

你能解釋一下這裏發生了什麼嗎?

回答

6

您正在查看的是在編譯cc1.1或cc1.2設備(在CUDA 6.5上)時使用的文件,該文件不具有對double算術的本機支持,並且是的CUDA會「安靜地」 「降級」doublefloat。 (編譯器在發生這種情況時會發出警告。)

此行爲沒有在計算能力1.3和更高版本的設備上表現出來,所有這些設備都支持double算法。

CUDA 7和7.5不再支持計算能力低於2.0的設備,因此這種特殊行爲不再能夠體現出來,並且它只會成爲新的CUDA工具包的歷史利益。 (而在問題的文件已經從這些較新的CUDA工具包中移除。)

作爲參考,當這種「降級」正在發生,則編譯器將發出以下形式的警告:

ptxas /tmp/tmpxft_00000949_00000000-2_samplefilename.ptx, line 65; warning : Double is not supported. Demoting to float 

如果您在編譯輸出中看不到該警告,則不會發生降級。

+0

當您在Visual Studio中創建.cu文件時,我認爲它默認設置計算功能1.0。我看到很多其他人將來會遇到這個問題。 –

+2

無論「這個問題」是什麼,我幾乎看不到這個問題將來沒有人在將來。 CUDA 7的CUDA工具鏈以及所有未來的CUDA版本中已經刪除了這種降級功能。默認計算能力[因CUDA工具包版本而異](http://stackoverflow.com/questions/28932864/cuda-compute-capability-requirements)以及CUDA 7及更高版本不設置默認值1.0。 –

+2

即使在CUDA 6.5中,'nvcc'的* default *目標架構是sm_20。如果我正確地記得,使用sm_1x作爲默認目標架構的CUDA的最後一個版本是兩年前發佈的CUDA 6.0。因此,我同意Robert Crovella所說的雙重降級降級應該不會成爲問題,因爲在CUDA 7.0中完全刪除了功能和文件,而且大多數sm_1x GPU已經被停用/報廢了。 – njuffa

相關問題