为了性能的原因,我在C中重新实现了Matlab函数。现在,我正在寻找计算矢量投影到单元盒上的最有效方法。将矢量投影到单元框上的高效方法
在C而言,我想计算
double i = somevalue;
i = (i > 1.) ? 1. : i;
i = (i < -1.) ? -1. : i;
,因为我必须做这个操作几百万的时候,我想这可能是实现这一目标的最有效方式。
为了性能的原因,我在C中重新实现了Matlab函数。现在,我正在寻找计算矢量投影到单元盒上的最有效方法。将矢量投影到单元框上的高效方法
在C而言,我想计算
double i = somevalue;
i = (i > 1.) ? 1. : i;
i = (i < -1.) ? -1. : i;
,因为我必须做这个操作几百万的时候,我想这可能是实现这一目标的最有效方式。
您是否考虑使用SSE instructions加快您的代码?
此外,您可以使用OpenMP并行您的代码,从而使其更快。
如果你在686上,你的编译器可能会将条件转换为CMOV指令,这可能足够快。
查看问题Fastest way to clamp a real (fixed/floating point) value?进行实验。 @Spat也建议MINSS/MINSD和MAXSS/MAXSD指令,它们可作为编译器的内在函数使用。他们是SSE指令,并且可能是您的最佳选择,同样,只要您使用的是686即可。
+1,re CMOV:这取决于处理器架构和CPU调度(http://ondioline.org/mail/cmov-a-bad-idea-on-out-of-order-cpus) – sehe
据我所知,一些CPU架构有特殊的指令来限制这样的值;一个体面的C编译器应该检测到它可以使用这样的指令并对其进行优化。如果你想解决高维矢量空间的问题,当然细节取决于你的矢量规范。 –
可能的重复:http://stackoverflow.com/questions/427477/fastest-way-to-clamp-a-real-fixed-floating-point-value –
@ alexandre-c是的,我问过同样的问题这是重复的。不幸的是,我找不到原来的问题。 – Carsten