【问题标题】:Efficient way to project vectors onto unit box将向量投影到单元盒上的有效方法
【发布时间】:2011-07-05 14:23:50
【问题描述】:

出于性能原因,我正在用 C 语言重新实现一个 Matlab 函数。现在,我正在寻找最有效的方法来计算向量在单元盒上的投影。

在 C 语言中,我想计算

double i = somevalue;
i = (i >  1.) ?  1. : i;
i = (i < -1.) ? -1. : i;

由于我必须执行此操作数百万次,我想知道实现此操作的最有效方法是什么。

【问题讨论】:

  • 据我所知,一些 CPU 架构有特殊的指令来限制这样的值;一个体面的 C 编译器应该检测到它可以使用这样的指令并对其进行优化。如果你想解决更高维向量空间的问题,当然细节取决于你的向量范数。
  • @alexandre-c 是的,我问过同样的问题,所以这是重复的。不幸的是,我找不到原来的问题。

标签: c++ c math optimization


【解决方案1】:

如果您使用的是 686,您的编译器可能会将条件转换为 CMOV 指令,这可能已经足够快了。

请参阅问题Fastest way to clamp a real (fixed/floating point) value? 进行实验。 @Spat 还建议使用 MINSS/MINSD 和 MAXSS/MAXSD 指令,它们可以作为编译器的内部函数使用。它们是 SSE 说明,如果您使用 686,它们可能是您的最佳选择。

【讨论】:

【解决方案2】:

如果您/“编译器”使用 IEEE 754 双精度格式,我认为读取双精度存储器的第一位(符号位)可能是最直接的方法。那么您就不需要额外的round 或除法操作了。

【讨论】:

  • 我很想看看有没有这种“优化”的性能比较!
  • @Kerrek SB:是的,我也是,但它似乎是唯一一个可以击败编译器的技巧来做同样事情的人。我写这个答案是因为他假设 OP 的代码很慢(即不是最快的)。
  • @Carsten:然后让编译器完成它的工作。它知道的比你多得多。
【解决方案3】:

您是否考虑过使用SSE instructions 来加速您的代码?

您还可以使用OpenMP 来并行化您的代码,从而使其更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多