为什么使用计算能力 1.3 的简单 RGB 到 Lab 转换比 1.0 慢得多,即使使用 -use_fast_math 标志?
Why is a simple RGB to Lab conversion much slower using compute capability 1.3 than 1.0 even with -use_fast_math flag?
我使用的是 GT 740M (CC 3.5),我有一个 RGB 到 Lab 的转换内核。使用 1.0 - 1.2 的计算能力,整个内核的执行时间为 924 微秒,但是使用 1.3 或更高(最高 3.5)的计算能力,内核的执行时间约为 3 毫秒。根据维基百科 table http://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications 我发现这可能是由双精度浮点运算引起的,所以我使用了 -use_fast_math 标志,但它没有帮助。
性能下降的原因可能是什么?
cc 1.0 - 1.2 设备不支持双精度浮点运算。这些操作将 "demoted" 到这些设备上的单精度浮点操作。
乍一看,你所有的变量都是float
而不是double
,但是你的常量都是双精度常量。
因此算术是这样的:
a=(x-y)*500.0;
将在支持它的编译目标上涉及双精度浮点乘法(随后将减少为 float
)。在不支持它的编译目标上,上述操作将完全通过单精度数学处理。
--use-fast-math
选项不影响 double
和 float
之间的转换,如上所述。
我建议您首先将所有常量装饰为浮点常量:
a=(x-y)*500.0f;
您可能还想仔细查看 CUDA math api 以确保您从这样的操作中得到您想要的:
exp(log(x)/3.0)
在单精度或双精度算术方面。
我使用的是 GT 740M (CC 3.5),我有一个 RGB 到 Lab 的转换内核。使用 1.0 - 1.2 的计算能力,整个内核的执行时间为 924 微秒,但是使用 1.3 或更高(最高 3.5)的计算能力,内核的执行时间约为 3 毫秒。根据维基百科 table http://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications 我发现这可能是由双精度浮点运算引起的,所以我使用了 -use_fast_math 标志,但它没有帮助。
性能下降的原因可能是什么?
cc 1.0 - 1.2 设备不支持双精度浮点运算。这些操作将 "demoted" 到这些设备上的单精度浮点操作。
乍一看,你所有的变量都是float
而不是double
,但是你的常量都是双精度常量。
因此算术是这样的:
a=(x-y)*500.0;
将在支持它的编译目标上涉及双精度浮点乘法(随后将减少为 float
)。在不支持它的编译目标上,上述操作将完全通过单精度数学处理。
--use-fast-math
选项不影响 double
和 float
之间的转换,如上所述。
我建议您首先将所有常量装饰为浮点常量:
a=(x-y)*500.0f;
您可能还想仔细查看 CUDA math api 以确保您从这样的操作中得到您想要的:
exp(log(x)/3.0)
在单精度或双精度算术方面。