为什么使用计算功能1.3的简单RGB到Lab的转换比使用-use_fast_math标志的1.0慢得多



我使用的是GT 740M(CC 3.5),我有一个RGB到Lab的转换内核。使用计算能力1.0-1.2,整个内核在924微秒内执行,但使用1.3或更高(高达3.5)的计算能力,内核在大约3毫秒内执行。根据维基百科的表格http://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications我发现它可能是由双精度浮点运算引起的,所以我使用了-use_fast_math标志,但它没有帮助。

性能受到影响的原因是什么?

整个源代码可以在http://pastebin.com/JjhH101y

cc 1.0-1.2设备不支持双精度浮点运算。这些操作将在这些设备上"降级"为单精度浮点操作。

乍一看,您所有的变量都是float而不是double,但您的常量都是双精度常量。

因此算术如下:

a=(x-y)*500.0;

将涉及对支持它的编译目标的双精度浮点乘法(随后将减少为float)。对于不支持它的编译目标,上述操作将完全通过单精度数学处理。

--use-fast-math选项不影响如上所述的doublefloat之间的转换。

我建议您从将所有常量装饰为浮点常量开始:

a=(x-y)*500.0f;

您可能还需要仔细审查CUDA数学api,以确保您从以下操作中获得所需内容:

exp(log(x)/3.0)

在单精度或双精度算术方面。

最新更新