эффективная оценка max (a, b) внутри цикла c.f. прогноз отрасли? - PullRequest
1 голос
/ 07 мая 2011

Какой эффективный способ вычислить максимум 2 числа с плавающей точкой внутри цикла for в C без использования логического оператора, который может остановить конвейер, такой как a > b ? a : b?

Я работаю с огромными трехмерными массивами, и у меня есть тонны циклов итераций.

Ответы [ 2 ]

6 голосов
/ 07 мая 2011

Проверьте, что выводит ваш компилятор, он, вероятно, уже "оптимален". Например,

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   

т.е. компилятор знает много о наборе инструкций, на который вы нацелены, и семантике вашего кода. Пусть это сделает свое дело.

0 голосов
/ 07 мая 2011

Ну, я не думаю, что это быстрее, чем использование ветвления, но, похоже, это работает:

#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;
}

Определения были взяты из Совокупные магические алгоритмы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...