Optimization 机器指令fxtod是否应该慢得离谱 我有一个程序,我尝试用循环编程优化它是用C++编写的,用gcc/p>编译。

Optimization 机器指令fxtod是否应该慢得离谱 我有一个程序,我尝试用循环编程优化它是用C++编写的,用gcc/p>编译。,optimization,gcc,sparc,Optimization,Gcc,Sparc,最终,我使用一个分析器跟踪到了循环执行时间的一半以上 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 作为测试,我

最终,我使用一个分析器跟踪到了循环执行时间的一半以上

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的引用,从而将无符号int转换为double,并且在Ultrasparc IV处理器上执行大约12个浮点操作的循环中,循环的执行时间减少了近一半。我确认Ultrasparc II上也是这样

从int到double的转换比缓存丢失的代价要高得多,更不用说浮点乘法了,这正常吗?如果是这样,其他人通常会怎么做


对于所有可能的nn值(在本例中,这些值具有已知的有限范围)的查找表将比此更快

fxtod可能是模拟的,而不是本机执行的,这将使其缓慢运行。谷歌发现了一个Sun bug 4870754,它抱怨USII中的fxtod,这在2003年的Sun编译器中被修复,显然是使用了其他指令序列来替换fxtod。你试过用Sun的编译器编译吗?从历史上看,他们在SPARC上的表现优于gcc。披露:我以前为Sun工作,现在在Oracle。我试过SunStudio编译器。它没有生成fxtod,但总体上循环速度慢了30%。在探查器中运行它,看起来它正在生成更多的内存访问,同时出现缓存未命中或2。我猜这是查表法啊,真令人失望。我假设您已经尝试了两个编译器的各种优化级别和其他编译器选项组合,并且您无法将ulong->double转换从循环中提升出来。另一种选择是,如果Studio代替fxtod发出的指令看起来比fxtod快,那么您可以尝试在内联汇编语言片段中使用gcc。但这可能比使用查找表更痛苦。不可能声明double类型的循环索引nn吗?也许相反的强制转换在需要时加倍到int比这个更快。只是一个想法-最后,用锁表替换了cast,循环的速度比原始版本快了300%,可读性也大大降低。已编译的查找表版本SunStudio编译器,它仅比gcc编译版本慢5%。这不是一个真正公平的测试,因为循环已经通过了gcc profiler的多次迭代,并进行了更多的优化。我没有仔细查看SunStudio生成的是什么,而不是fxtod,但这是再好不过的了。我知道评测经常会在您不希望出现瓶颈的地方出现瓶颈,但这个瓶颈是荒谬的。fxtod可能是模拟的,而不是本机执行的,这会使它变得缓慢。谷歌发现了一个Sun bug 4870754,它抱怨USII中的fxtod,这在2003年的Sun编译器中被修复,显然是使用了其他指令序列来替换fxtod。你试过用Sun的编译器编译吗?从历史上看,他们在SPARC上的表现优于gcc。披露:我以前为Sun工作,现在在Oracle。我试过SunStudio编译器。它没有生成fxtod,但总体上循环速度慢了30%。在探查器中运行它,看起来它正在生成更多的内存访问,同时出现缓存未命中或2。我猜这是查表法啊,真令人失望。我假设您已经尝试了两个编译器的各种优化级别和其他编译器选项组合,并且您无法将ulong->double转换从循环中提升出来。另一种选择是,如果Studio代替fxtod发出的指令看起来比fxtod快,那么您可以尝试在内联汇编语言片段中使用gcc。但这可能比使用查找表更痛苦。不可能声明double类型的循环索引nn吗?也许相反的强制转换在需要时加倍到int比这个更快。只是一个想法-最后,用锁表替换了cast,循环的速度比原始版本快了300%,可读性也大大降低。已编译的查找表版本SunStudio编译器,它仅比gcc编译版本慢5%。这不是一个真正公平的测试,因为循环已经通过了gcc profiler的多次迭代,并进行了更多的优化。我没有仔细查看SunStudio生成的是什么,而不是fxtod,但这是再好不过的了。我知道评测经常会出现你意想不到的瓶颈,但是这个特别的b 奥特莱克很可笑。