2011-07-05 36 views
2

为了性能的原因,我在C中重新实现了Matlab函数。现在,我正在寻找计算矢量投影到单元盒上的最有效方法。将矢量投影到单元框上的高效方法

在C而言,我想计算

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

,因为我必须做这个操作几百万的时候,我想这可能是实现这一目标的最有效方式。

+0

据我所知,一些CPU架构有特殊的指令来限制这样的值;一个体面的C编译器应该检测到它可以使用这样的指令并对其进行优化。如果你想解决高维矢量空间的问题,当然细节取决于你的矢量规范。 –

+0

可能的重复:http://stackoverflow.com/questions/427477/fastest-way-to-clamp-a-real-fixed-floating-point-value –

+0

@ alexandre-c是的,我问过同样的问题这是重复的。不幸的是,我找不到原来的问题。 – Carsten

回答

1

如果您的编译器使用IEEE 754双格式,我认为读取double内存的第一位(符号位)可能是最直接的方式。那么你就不需要额外的round或分部操作。

+0

我很好奇看到有没有这种“优化”的性能比较! –

+0

@ Kerrek SB:是的,我也是,但它似乎是唯一能够击败编译器的技巧来做同样的事情。我在写作这个答案时假设OP的代码很慢(即不是最快的)。 – rubenvb

+0

谢谢,但我不想使用bit hacking技巧 – Carsten

2

如果你在686上,你的编译器可能会将条件转换为CMOV指令,这可能足够快。

查看问题Fastest way to clamp a real (fixed/floating point) value?进行实验。 @Spat也建议MINSS/MINSD和MAXSS/MAXSD指令,它们可作为编译器的内在函数使用。他们是SSE指令,并且可能是您的最佳选择,同样,只要您使用的是686即可。

+0

+1,re CMOV:这取决于处理器架构和CPU调度(http://ondioline.org/mail/cmov-a-bad-idea-on-out-of-order-cpus) – sehe