我的CUDA计划在其计算中仅使用float
,int
,short
和char
类型。输入或输出数组都不具有double
类型的成员。在计算过程中,没有内核在其中创建任何double
类型。
此程序是使用NSight Eclipse在发布模式下使用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服务器设置程序中启用CUDA Double Precision选项来完成。
虽然我对这个免费速度奖金感到高兴,但我想了解为什么CUDA浮动程序在FP64模式下可以更快的原因?
答案 0 :(得分:2)
我想当你在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,Titan的信息有GK110。但它是一个架构。所以我认为GK110也有这个机会。
答案 1 :(得分:0)
Titan卡默认情况下FP64实现“上限”,这主要是出于功率效率和时钟速度的原因。
NVIDIA默认情况下故意选择不启用此功能,而是让您通过将FP64设置为全速(1/3 FP32)或降低速度(1/24 FP32)来控制行为。
参考文献:http://www.anandtech.com/show/6760/nvidias-geforce-gtx-titan-part-1/4