我有一个程序,我试图执行一些循环优化它用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的转换生成了profiler标记的汇编指令fxtod
作为测试,我从行中删除了对nn的引用,从而将unsigned int中的强制转换为double,并且循环的执行时间减少了近一半,在一个执行大约十几个浮点运算的循环中Ultrasparc IV处理器。我确认在Ultrasparc II上也是如此,
从int到double的强制转换是否正常,缓存未命中,更不用说浮点数倍增了?如果是这样,其他人通常会怎么做呢?
nn的所有可能值的查找表(在这种情况下具有已知的有限范围)将比此更快