我有一个程序,我试图对其执行一些循环优化它是用 C++ 编写并使用 gcc 编译的
最终使用探查器,我跟踪了循环执行时间的一半以上到该行
double x_component = in.input_vector[in.dimension_to_process] - \
(center_of_bin_0 + (double) nn * grid_distance);
这一行的所有内容都是 double 类型,但循环索引 nn 的类型是 long unsigned int
从 long unsigned int 到 double 的转换生成分析器标记的汇编指令 fxtod
作为测试,我从行中删除了对 nn 的引用,从而将强制转换从 unsigned int 删除为 double 并且循环的执行时间减少了近一半,在一个对 Ultrasparc IV 执行大约十几个浮点操作的循环中处理器。我确认 Ultrasparc II 也是如此,
从 int 到 double 的转换比缓存未命中要贵得多,更不用说浮点乘法是否正常?如果是这样,其他人通常会怎么做呢?
nn 的所有可能值(在这种情况下具有已知的有限范围)的查找表将比这更快