铸造双重浮动的开销?

时间:2009-09-23 16:13:55

标签: c++ c

所以我有兆字节的数据存储为需要通过网络发送的双精度数...现在我不需要double提供的精度,所以我想将它们转换为浮点数,然后再发送它们网络。简单地做的开销是多少:

float myFloat = (float)myDouble;

我每隔几秒钟就会做几百万次这样的操作,不想放慢速度。感谢

编辑:我的平台是使用Visual Studio 2008的x64。

编辑2:我无法控制它们的存储方式。

8 个答案:

答案 0 :(得分:11)

正如Michael Burr所说,虽然开销很大程度上取决于您的平台,但开销肯定小于通过网络发送它们所需的时间。


粗略估计:

优质千兆线上800MBit / s有效载荷,25M浮点/秒。

在一个2GHz的单核上,每个转换为收支平衡的值可以为您带来惊人的 80 时钟周期 - 任意更少,您将节省时间。这应该足以应对所有体系结构:)

一个简单的加载 - 存储周期(除非所有缓存延迟)每个值应低于5个周期。通过指令交叉,SIMD扩展和/或在多个内核上并行化,您可能在一个周期内进行多次转换。

此外,接收器将很乐意只处理一半的数据。请记住,内存访问时间是非线性的。


唯一反对转换的是如果传输应该具有最小的CPU负载:现代架构可以在没有CPU干预的情况下将数据从磁盘/内存传输到总线。但是,有了上述数字,我认为这在实践中无关紧要。

<强> [编辑]
我检查了一些数字,387协处理器确实需要大约70个周期来进行加载 - 存储周期。在最初的奔腾中,您可以在没有任何并行化的情况下进行3个循环。

所以,除非你在386上运行千兆网络......

答案 1 :(得分:9)

这将取决于您对C ++库的实现。测试一下,看看。

答案 2 :(得分:6)

即使确实需要时间,这也不是您申请中的慢点 您的FPU可以比发送网络流量更快地进行转换(因此这里的瓶颈很可能是写入套接字)。

但是像这样的东西测量它并看到它。

我个人认为在这里花费的任何时间都会影响发送数据的实际时间。

答案 3 :(得分:4)

假设您正在讨论大量数据包以发送数据(如果您发送数百万个值,这是一个合理的假设)将双精度数转换为浮动可能会将网络数据包的数量减少一半(假设sizeof(double)==8sizeof(float)==4)。

几乎可以肯定,网络流量的节省将占据执行转换所花费的时间。但正如大家所说,测量一些测试将证明布丁。

答案 4 :(得分:3)

请记住,大多数编译器处理doubles的效率比floats高得多 - 许多编译器在执行操作之前将float提升为double - 我d考虑获取数据块,压缩/压缩它,然后发送压缩块。根据您的数据情况,您可以获得60-90%的压缩率,而将50%的压缩率转换为4个字节。

答案 5 :(得分:2)

你别无选择,只能自己测量并看到。您可以使用计时器来测量它们。看起来有些已经实现了整洁的C++ timer class

答案 6 :(得分:2)

我认为这个演员比你想象的要便宜得多,因为它并没有真正涉及任何计算。实际上,它只是位移以摆脱指数和尾数的一些数字。

答案 7 :(得分:1)

它还取决于CPU及其支持的浮点数。在过去的糟糕时期(20世纪80年代),处理器仅支持整数运算。必须在软件中模拟浮点数学。一个单独的浮点芯片(coprocessor)可以单独购买。

现代CPU现在有SIMD条指令,因此可以同时处理大量浮点数据。这些说明包括MMX,SSE,3DNow!等等。您的编译器可能知道如何使用这些指令,但您可能需要以特定方式编写代码,并打开正确的选项。

最后,处理浮点数据的最快方法是在视频卡中。一种名为OpenCL的相当新的语言允许您将任务发送到要在那里处理的视频卡。

这一切都取决于你需要多少性能。