Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 为什么使用compute capability 1.3进行简单的RGB到实验室的转换要比使用-use_fast_math标志的1.0慢得多?_Visual Studio 2012_Cuda_Gpu_Gpgpu - Fatal编程技术网

Visual studio 2012 为什么使用compute capability 1.3进行简单的RGB到实验室的转换要比使用-use_fast_math标志的1.0慢得多?

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而不

我使用GT740M(CC3.5),我有一个RGB到实验室的转换内核。使用计算能力1.0-1.2,整个内核的执行时间为924微秒,但是使用计算能力1.3或更高(高达3.5),内核的执行时间约为3毫秒。根据wikipedia的表,我发现这可能是由双精度浮点运算引起的,因此我使用了-use_fast_math标志,但这没有帮助

演出失败的原因是什么


整个源代码可以在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