有效评估max(a,b)内部循环c.f.分支预测?

时间:2011-05-07 14:24:18

标签: c performance optimization architecture cpu

在不使用可能会导致管道失效的逻辑语句(如a > b ? a : b

的情况下,计算C中for循环内2个浮点数的最大值的有效方法是什么?

我正在使用巨大的3D阵列并进行大量的循环迭代。

2 个答案:

答案 0 :(得分:6)

检查编译器输出的内容,它可能已经“最佳”了。例如,

float foo(float a, float b)
{
    return (a>b?a:b);
}

使用GCC 4.5 -O3编译,在x86_64上生成此程序集:

Disassembly of section .text:

0000000000000000 <foo>:
   0:   f3 0f 5f c1             maxss  %xmm1,%xmm0
   4:   c3                      retq   

即。编译器非常了解您所针对的指令集以及代码的语义。让它发挥作用。

答案 1 :(得分:0)

好吧,我不认为这比使用分支更快,但这似乎有效:

#include <stdio.h>

#define FasI(f)  (*((int *) &(f)))
#define FasUI(f) (*((unsigned int *) &(f)))

#define lt0(f)  (FasUI(f) > 0x80000000U)
#define le0(f)  (FasI(f) <= 0)
#define gt0(f)  (FasI(f) > 0)
#define ge0(f)  (FasUI(f) <= 0x80000000U)


int main()
{
    float a=11.0,b=4.6;
    float x=a-b,y=b-a;

    printf("%f\n",lt0((y))*a+lt0((x))*b);
    return 0;
}

定义来自The Aggregate Magic Algorithms