我使用的是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
选项不影响如上所述的double
和float
之间的转换。
我建议您从将所有常量装饰为浮点常量开始:
a=(x-y)*500.0f;
您可能还需要仔细审查CUDA数学api,以确保您从以下操作中获得所需内容:
exp(log(x)/3.0)
在单精度或双精度算术方面。