【发布时间】:2016-04-08 11:10:08
【问题描述】:
我真的需要非常快的 C 中的 round() 函数 - 蒙特卡洛粒子建模是必要的: 在每一步,您都需要将坐标包装到周期框中以计算体积交互:例如
for(int i=0; i < 3; i++)
{
coor.x[i] = a.XReal.x[i]-b.XReal.x[i];
coor.x[i] = coor.x[i] - SIZE[i]*round(coor.x[i]/SIZE[i]); //PBC
}
我遇到过一些 asm hacking,但我根本不懂 asm:) 像这样的
inline int float2int2(float flt)
{
int intgr;
__asm__ __volatile__ ("fld %1; fistp %0;" : "=m" (intgr) : "m" (flt));
return intgr;
}
有了固定的边界,没有 round() 它工作得更快。 那么,也许有人知道更好的方法?..
【问题讨论】:
-
您找到的 asm 几乎毫无用处:它是特定于体系结构的 (x86) 并使用旧的 x87 fpu(慢,可怕)。如果您使用的是 x86-64,则最好使用 sse 指令,任何理智的编译器都会自动发出。
-
谢谢!我忘了提 - 需要最接近整数舍入。比如 0.8 -> 1, -2.7 -> -3
-
您是否尝试过执行此操作的标准函数 (
remainder()) 在性能方面的比较? -
round()舍入“到最近,从零开始”,可能更快的rint()舍入“到最近,从零开始”。如果您可以容忍差异,请尝试rint()。性能方面,我会更关心这段代码中的浮点除法。什么是 SIZE[i] 的典型值,这些是编译时常量吗? -
这个问题有一个非常有用的技巧,适用于有限的输入范围:stackoverflow.com/questions/17035464/…
标签: c performance floating-point modeling