Visual studio 2012 为什么使用compute capability 1.3进行简单的RGB到实验室的转换要比使用-use_fast_math标志的1.0慢得多?
我使用GT740M(CC3.5),我有一个RGB到实验室的转换内核。使用计算能力1.0-1.2,整个内核的执行时间为924微秒,但是使用计算能力1.3或更高(高达3.5),内核的执行时间约为3毫秒。根据wikipedia的表,我发现这可能是由双精度浮点运算引起的,因此我使用了-use_fast_math标志,但这没有帮助 演出失败的原因是什么Visual studio 2012 为什么使用compute capability 1.3进行简单的RGB到实验室的转换要比使用-use_fast_math标志的1.0慢得多?,visual-studio-2012,cuda,gpu,gpgpu,Visual Studio 2012,Cuda,Gpu,Gpgpu,我使用GT740M(CC3.5),我有一个RGB到实验室的转换内核。使用计算能力1.0-1.2,整个内核的执行时间为924微秒,但是使用计算能力1.3或更高(高达3.5),内核的执行时间约为3毫秒。根据wikipedia的表,我发现这可能是由双精度浮点运算引起的,因此我使用了-use_fast_math标志,但这没有帮助 演出失败的原因是什么 整个源代码可以在cc 1.0-1.2中看到,设备不支持双精度浮点运算。在这些设备上,这些操作将“降级”为单精度浮点操作 乍一看,所有变量都是float而不
整个源代码可以在cc 1.0-1.2中看到,设备不支持双精度浮点运算。在这些设备上,这些操作将“降级”为单精度浮点操作 乍一看,所有变量都是
float
而不是double
,但常数都是双精度常数
因此,我们应该这样做:
a=(x-y)*500.0;
exp(log(x)/3.0)
将在支持它的编译目标上使用双精度浮点乘法(随后将减少为浮点
)。在不支持它的编译目标上,上述操作将完全通过单精度数学处理
如上文所述,--use fast math
选项不会影响double
和float
之间的转换
我建议您首先将所有常量装饰为浮点常量:
a=(x-y)*500.0f;
您可能还需要仔细检查,以确保从以下操作中获得所需的:
a=(x-y)*500.0;
exp(log(x)/3.0)
就单精度或双精度算术而言。cc 1.0-1.2设备不支持双精度浮点运算。在这些设备上,这些操作将“降级”为单精度浮点操作 乍一看,所有变量都是
float
而不是double
,但常数都是双精度常数
因此,我们应该这样做:
a=(x-y)*500.0;
exp(log(x)/3.0)
将在支持它的编译目标上使用双精度浮点乘法(随后将减少为浮点
)。在不支持它的编译目标上,上述操作将完全通过单精度数学处理
如上文所述,--use fast math
选项不会影响double
和float
之间的转换
我建议您首先将所有常量装饰为浮点常量:
a=(x-y)*500.0f;
您可能还需要仔细检查,以确保从以下操作中获得所需的:
a=(x-y)*500.0;
exp(log(x)/3.0)
就单精度或双精度算术而言。cc 1.0-1.2设备不支持双精度浮点运算。在这些设备上,这些操作将“降级”为单精度浮点操作 乍一看,所有变量都是
float
而不是double
,但常数都是双精度常数
因此,我们应该这样做:
a=(x-y)*500.0;
exp(log(x)/3.0)
将在支持它的编译目标上使用双精度浮点乘法(随后将减少为浮点
)。在不支持它的编译目标上,上述操作将完全通过单精度数学处理
如上文所述,--use fast math
选项不会影响double
和float
之间的转换
我建议您首先将所有常量装饰为浮点常量:
a=(x-y)*500.0f;
您可能还需要仔细检查,以确保从以下操作中获得所需的:
a=(x-y)*500.0;
exp(log(x)/3.0)
就单精度或双精度算术而言。cc 1.0-1.2设备不支持双精度浮点运算。在这些设备上,这些操作将“降级”为单精度浮点操作 乍一看,所有变量都是
float
而不是double
,但常数都是双精度常数
因此,我们应该这样做:
a=(x-y)*500.0;
exp(log(x)/3.0)
将在支持它的编译目标上使用双精度浮点乘法(随后将减少为浮点
)。在不支持它的编译目标上,上述操作将完全通过单精度数学处理
如上文所述,--use fast math
选项不会影响double
和float
之间的转换
我建议您首先将所有常量装饰为浮点常量:
a=(x-y)*500.0f;
您可能还需要仔细检查,以确保从以下操作中获得所需的:
a=(x-y)*500.0;
exp(log(x)/3.0)
在单精度或双精度算法方面。我建议使用
cbrt(x)
而不是exp(log(x)/3.0)
。谢谢你,罗伯特,这很有帮助。现在执行时间是0.472毫秒。njuffa我试图用cbrt替换它,但它没有影响执行时间,但是我将检查它是否影响精度,谢谢你们两位。@Dave现在查看pastebin上的完整代码,您的代码看起来内存不足。尝试const-uchar4*\uuuuu-restrict\uuuuuu-inputImg,float4*\uuu-restrict\uuuuuu-outputImg
,这可能有助于优化内存访问。一般来说,cbrt(x)
应该比exp(log(x)/3))
更快更准确。但是我的图像是640x480,GT 740m的恒定内存只有64KiB,所以使用const\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?谢谢。const\uuuu restrict\uuuu
与\uu常量\uuuu
或常量内存不同const\uuuu restrict\uuuuuu
通常帮助编译器进行优化,并且可能有助于在支持的设备上启用。而不是exp(log(x)/3.0)
I wou