Pourquoi est-floor() si lent?

J'ai écrit du code récemment (ISO/ANSI C), et a été surpris de la mauvaise performance qu'il a obtenus. Longue histoire courte, il s'est avéré que le coupable était le floor() fonction. Non seulement il était lent, mais il n'a pas vectoriser (avec le compilateur Intel, aka ICL).

Voici quelques repères pour la réalisation de plancher pour toutes les cellules dans une matrice 2D:

VC:  0.10
ICL: 0.20

De la comparer à une distribution simple:

VC:  0.04
ICL: 0.04

Comment peut - floor() être beaucoup plus lent qu'un simple cast?! Il fait essentiellement la même chose (à part pour les nombres négatifs).
2ème question: est-ce que quelqu'un sait d'un super-rapide floor() mise en œuvre?

PS: Voici la boucle que j'ai été benchmarking:

void Floor(float *matA, int *intA, const int height, const int width, const int width_aligned)
{
    float *rowA=NULL;
    int   *intRowA=NULL;
    int   row, col;

    for(row=0 ; row<height ; ++row){
        rowA = matA + row*width_aligned;
        intRowA = intA + row*width_aligned;
#pragma ivdep
        for(col=0 ; col<width; ++col){
            /*intRowA[col] = floor(rowA[col]);*/
            intRowA[col] = (int)(rowA[col]);
        }
    }
}
InformationsquelleAutor | 2009-05-05