我的CUDA程序在其计算中仅使用float
,int
,short
和char
类型。输入或输出数组都没有double
类型的成员。在计算过程中,没有一个内核在其中创建任何double
类型。
该程序已使用NSight Eclipse在 Release模式下使用CUDA SDK 5.5进行了编译。典型的编译行如下所示:
nvcc -O3 -gencode arch=compute_35,code=sm_35 -M -o "src/foo.d" "../src/foo.cu"
我在Linux上的GTX Titan上运行此程序。令我惊讶的是,我注意到在Titan上启用全速FP64模式时,该程序的运行速度提高了10%。这可以通过在NVIDIA X Server Settings程序中启用CUDA Double Precision选项来完成。
尽管我为获得这种免费速度奖励感到高兴,但我想了解CUDA float 程序在FP64模式下可以变得更快的原因?
最佳答案
我猜想,当在Titan上启用全速FP64模式时,更多的计算单元开始参与计算,并且这些FP64计算单元可用于计算FP32。但是,启用大量FP64块也会降低时钟速度,因此计算速度仅提高10%。
如何获得10%?
当Titan在1/24 FP64模式下运行时,它的运行频率为837MHz。当它以1/3 FP64模式运行时,它以725MHz运行。因此(1 + 1/3)/(1 + 1/24)* 725/837 = 1.109。
引用:http://www.anandtech.com/show/6760/nvidias-geforce-gtx-titan-part-1/4
我发现了我的猜测。
“此外,CUDA FP64块具有非常特殊的执行率:1/1 FP32。”
引用http://www.anandtech.com/show/5699/nvidia-geforce-gtx-680-review/2
该信息为GK104,泰坦拥有GK110。但这是一种架构。所以我认为GK110也有这个机会。