【问题标题】:Set all floating point literals to floats MSVC++将所有浮点文字设置为浮点 MSVC++
【发布时间】:2015-04-29 21:24:52
【问题描述】:

我正在用 C++ 编写一些数字代码,我希望能够在使用双精度和浮点数之间进行切换。因此,我添加了一个#define MYFLT,我可以根据需要制作一个浮点数或双精度数。但是,我该如何处理各种数字文字。 例如

MYFLT someNumber = 1.2;
MYFLT someOtherNumber = 1.5f;

当 MYFLT 为浮点数时为第一行提供编译器警告,当 MYFLT 为双精度时为第二行提供编译器警告。我知道这是一个微不足道的例子,但在其他情况下,我有更长的文字表达式,并且浮点数最终可能被转换为双精度数,然后结果又回到浮点数,我认为这会花费我显着的性能。我该如何处理?

我可以做类似的事情

MYFLT someNumber = MYFLT(1.2);
MYFLT someOtherNumber = MYFLT(1.5);

但这很乏味。我假设如果我这样做,编译器足够聪明,可以在需要时使用浮点数(有人可以确认吗?)。如果有一个 MSVC++ 编译器开关或 #define 会告诉编译器将所有浮点文字视为浮点数而不是双精度数会更好。有这样的开关吗?

即使我像上面那样包装所有文字,当我使用 float 而不是 double 时,我的代码运行速度也会慢 50%。我期待通过 simd 类型的操作来提升性能,而不是惩罚!

菲尔

【问题讨论】:

  • 可能很有趣stackoverflow.com/questions/3426165/…。例如。你为什么要这样做?
  • 提示:typedef 可能比使用 #define 更好
  • 如果您不进行矢量计算,SIMD 并不会真正有帮助,矢量化随机计算并不容易并且这样做会带来性能优势。此外,MSVC 通常会为单精度变量使用双精度指令。这意味着有时它会来回转换为双精度,即使您只有浮点数。也许你可以用 /fp:fast 禁用它,但要注意额外的副作用。
  • 我确实有一些矢量计算,但也许我的循环格式不够好,无法进行矢量化。我还将大量数据写入 ram(几 GB),并期望通过将数据减半来加快速度。我想这是一个确保你分析我们的代码的情况!
  • MYFLT(1.2) 将导致双重舍入,这是不好的。您需要附加 f 后缀以确保它正确四舍五入到浮点精度

标签: c++ visual-c++


【解决方案1】:

您想要的是#define MYFLTCONST(x) x##f#define MYFLTCONST(x) x,具体取决于您是否想要为float 附加一个f 后缀。

【讨论】:

    【解决方案2】:

    这是对我自己问题的(不完全)答案。

    我发现一个被多次调用的小函数(对 sin 的快速近似)没有将其文字转换为 MYFLT。额外的计算量也意味着编译器没有内联它。这个功能占了大部分差异。一些进一步的分析似乎表明访问std::vector<float>std::vector<double> 慢(如果重要,我正在使用 [] 进行访问)。用原始固定大小的数组替换 std::vectors 加快了 double 实现的速度,并显着缩小了 float 实现的差距。 float 版本现在只比 double 版本慢 10% 左右。但由于 RAM 访问或矢量化,绝对不会提高速度。我想我需要更仔细地考虑我的循环才能在那里获得任何好处。

    我想这里的结论(再次)是编译器非常擅长优化代码 - 使用它并进行仔细的分析要好得多,而不是尝试自己进行盲目的“优化”,这实际上可能有负面影响,比如停止编译器执行良好的内联。

    【讨论】:

    • 配置文件发布版本,而不是调试版本。我在 1999 年(是的,16 年前)测试了 std::vector 与原始数组,甚至在那时,发布版本也同样快。 IOW,std::vector 的抽象损失为零。如果重新引入抽象惩罚,这将是任何严肃的 C++ 编译器的重大回归。调试版本除外,因为今天的向量进行更多的调试检查
    • 我确实分析了发布版本,并且使用原始指针确实获得了更快的执行时间。我知道这个论点以前已经发生过很多次了,我不想在这里讨论它。我认为过去即使在发布版本中,我也注意到我使用 MSVC++ 检查了迭代器,但我不确定。 msdn.microsoft.com/en-us/library/aa985965.aspx 有信息表明在某些情况下,已检查的迭代器用于发布版本,但我不知道这是否相关。
    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多