ARM上的Clang vs gcc浮点性能

ARM上的Clang vs gcc浮点性能,gcc,assembly,arm,clang,instruction-set,Gcc,Assembly,Arm,Clang,Instruction Set,我正在试用clang编译器,想检查它相对于传统gcc的性能。我发现它在浮点运算方面的性能与gcc(近30%)相比非常差。我将代码的汇编文件与clang和gcc进行了比较,发现gcc使用的是F***(例如fcmpezd)函数,而clanf使用的是V**函数(例如vcmpe.f64)。这是否会影响指令周期数?我相信这两个指令都是别名 此外,在汇编文件中,每当定义函数时,参数都会被推送到堆栈上。GCC使用的是stmfd指令,而clang使用的是push指令,然后是add INTERCTION,向堆栈指

我正在试用clang编译器,想检查它相对于传统gcc的性能。我发现它在浮点运算方面的性能与gcc(近30%)相比非常差。我将代码的汇编文件与clang和gcc进行了比较,发现gcc使用的是F***(例如fcmpezd)函数,而clanf使用的是V**函数(例如vcmpe.f64)。这是否会影响指令周期数?我相信这两个指令都是别名

此外,在汇编文件中,每当定义函数时,参数都会被推送到堆栈上。GCC使用的是stmfd指令,而clang使用的是push指令,然后是add INTERCTION,向堆栈指针(sp)添加一些值(或寄存器内容)。这两组指令是否使用相同的周期-(stmfd)和(push,add)


我使用vfpv3作为选项,同时使用clang和gcc进行编译。另外,请推荐一些好的工具,告诉我一条指令将消耗多少指令周期

好的做法是附加简单的复制C代码和您正在编译的精确选项集。您可能只需要指定hardfp,或使用其他铿锵选项tuning.the fstuff和vstuff.stuff都是别名,编译为二进制并反汇编(如果可以),然后检查操作码。但这并不意味着这两个编译器使用完全相同的代码序列,但一种语法或另一种语法或两者的混合将起作用(至少在gnu汇编程序中是如此)。您不应该采用一条指令值多少的方法。尽管删除指令通常有助于提高性能,但检查每一条指令还需要更多的工作,比如检查序列等。您需要提供一些代码示例,了解如何对它们进行计时等(代码的准确计时与测试中的代码一样经常是个问题)。一般来说,clang在我的性能测试中也落后于gcc,我不使用浮点,但使用普通代码。当然,基准测试是非常主观的,可以调整使任何编译器看起来好或坏。很抱歉没有粘贴示例代码。代码非常庞大,因为小代码无法给出准确的结果。您可以在这里找到测试代码,我已经交叉编译了这个arm测试用例,其中包含选项“-march=armv7-a-mfpu=vfpv3-d16-mfloat=softfp”,用于clang和gcc,优化级别均为-O3。