IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

fcos de asm plus rapide?


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut fcos de asm plus rapide?
    Bonjour, suite au code fournie par flyweight
    http://www.developpez.net/forums/sho...55&postcount=8
    j'ai testé avec GCC pour voir les différences de performance... ET le cos de asm est plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <iostream>
    #include <cmath>
    #include <ctime>
    #include <vector>
    #include <limits>
     
    using namespace std;
     
    inline float asm_cos( float  x)
    {
        asm ("fcos" : "=t" (x) : "0" (x));
        return x;
    }
     
     
    int main()
    {
        clock_t time1;
        clock_t time2;
        clock_t time3;
        clock_t time4;
        const int nbCalcul = 10000000;
        vector<float> test_cos(nbCalcul);
        double somme(0);
        for (int  i=0;i<nbCalcul;++i)
                  somme+= fabs( cosf(static_cast<float>(i*2.f*M_PI/(nbCalcul-1)))-asm_cos(static_cast<float>(i*2.f*M_PI/(nbCalcul-1))));
        cout << "moyenne difference "<< somme/nbCalcul << endl;
        cout << "epsilon float "<< numeric_limits<float>::epsilon() << endl;
     
     
        for (int j=0;j<10;++j)
            {
            int i;
            time1 = clock();
            for ( i=0;i<nbCalcul;++i)
                  test_cos[i] = cosf(static_cast<float>(i*2.f*M_PI/(nbCalcul-1)));
            time2 = clock();
     
            for (i=0;i<nbCalcul;++i)
                    test_cos[i] = asm_cos(static_cast<float>(i*2.f*M_PI/(nbCalcul-1)));
            time3 = clock();
     
            time4 = clock();
            cout << "cos "<< static_cast<double>(time2 - time1) / CLOCKS_PER_SEC << endl;
            cout << "asm_cos "<<static_cast<double>(time3 - time2) / CLOCKS_PER_SEC << endl<< endl;
     
            }
     
     
        return 0;
    }
    La différences de résultat entre les cos semble négligeable (moyenne des differences < epsilon d'un float).
    Ai je fait une erreur? Es ce que j'interprète mal les résultats?

    Si quelqu'un à une réponse

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Les instructions assembleurs fsin/fcos, même si elles nécessitent de nombreux cycles d'horloge et ne sont pas pipelinées, sont à ma connaissance plus rapides que les fonctions des librairies C/C++.

    Mais si ça t'intéresses, y'a encore plus rapide à condition de sacrifier un tout petit peu en précision.
    Cherche sur Google la "Approximate Math Library for Intel Streaming SIMD Extensions". C'est une petite bibliothèque gratuite d'Intel, livrée avec les sources.
    Elle a en outre les avantages suivants:
    -possibilité de faire des sin/cos/log... vectoriellement (4 floats, 2 doubles)
    -si on utilise de toute façon les instructions SIMDs, il n'y a pas de transfert à faire d'un registre SSE/SSE2 vers un registre x87 (lent car passage par la mémoire)

    Par exemple les 4 fonctions suivantes permettent de calculer un cosinus d'un seul float (am_cos_ss), de 4 floats (am_cos_ps), un seul double (am_cos_ess) ou 2 doubles (am_cos_eps)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    /////////////////////////////////////////////////////////////////////////////
    // am_cos_ps
     
    __m128 __declspec(naked) __stdcall am_cos_ps(__m128 x)  // any x
    {
    	__asm
    	{
    		andps	xmm0, _ps_am_inv_sign_mask
    		mov		ecx, esp
    		addps	xmm0, _ps_am_pi_o_2
    		mulps	xmm0, _ps_am_2_o_pi
    		and		ecx, ~15
     
    		movhlps	xmm2, xmm0
    		cvttps2pi	mm0, xmm0
    		movq	mm2, mm0
    		cvttps2pi	mm1, xmm2
    		pslld	mm2, (31 - 1)
    		movq	mm3, mm1
    		pslld	mm3, (31 - 1)
    		pand	mm2, _pi32_0x80000000
    		movq	[ecx - 32], mm2
    		pand	mm3, _pi32_0x80000000
    		movq	[ecx - 32 + 8], mm3
     
    		cvtpi2ps	xmm4, mm1
    		pand	mm1, _pi32_1
    		ASM_MOVE_L2H(xmm4)
    		pxor	mm7, mm7
    		movaps	xmm5, _ps_am_1
    		cvtpi2ps	xmm4, mm0
    		pand	mm0, _pi32_1
    		pcmpeqd	mm1, mm7
    		subps	xmm0, xmm4
    		movq	[ecx - 16 + 8], mm1
    		minps	xmm0, xmm5
    		pcmpeqd	mm0, mm7
    		subps	xmm5, xmm0
    		movq	[ecx - 16], mm0
     
    		movaps	xmm6, [ecx - 16]
    		andps	xmm0, xmm6
    		andnps	xmm6, xmm5
    		movaps	xmm3, _ps_sincos_p3
    		orps	xmm0, xmm6
     
    		movaps	xmm5, _ps_sincos_p2
    		movaps	xmm1, xmm0
    		mulps	xmm0, xmm0
    		movaps	xmm7, [ecx - 32]
    		movaps	xmm2, xmm0
    		mulps	xmm0, xmm3
    		movaps	xmm3, _ps_sincos_p1
    		addps	xmm0, xmm5
    		movaps	xmm5, _ps_sincos_p0
    		mulps	xmm0, xmm2
    		addps	xmm0, xmm3
    		mulps	xmm0, xmm2
    		orps	xmm1, xmm7
    		addps	xmm0, xmm5
    		mulps	xmm0, xmm1
     
    		ret		16
    	}
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // am_cos_eps
     
    __m128 __declspec(naked) __stdcall am_cos_eps(__m128 x)  // any x
    {
    	__asm
    	{
    		andps	xmm0, _ps_am_inv_sign_mask
    		addps	xmm0, _ps_am_pi_o_2
    		mulps	xmm0, _ps_am_2_o_pi
     
    		pxor	xmm3, xmm3
    		movdqa	xmm5, _epi32_1
    		movaps	xmm4, _ps_am_1
    		cvttps2dq	xmm2, xmm0
    		pand	xmm5, xmm2
    		pcmpeqd	xmm5, xmm3
    		cvtdq2ps	xmm6, xmm2
    		pand	xmm2, _epi32_2
    		pslld	xmm2, (31 - 1)
     
    		subps	xmm0, xmm6
    		minps	xmm0, xmm4
    		subps	xmm4, xmm0
    		andps	xmm0, xmm5
    		andnps	xmm5, xmm4
    		orps	xmm0, xmm5
     
    		movaps	xmm1, xmm0
    		mulps	xmm0, xmm0
    		orps	xmm1, xmm2
    		movaps	xmm7, xmm0
    		mulps	xmm0, _ps_sincos_p3
    		addps	xmm0, _ps_sincos_p2
    		mulps	xmm0, xmm7
    		addps	xmm0, _ps_sincos_p1
    		mulps	xmm0, xmm7
    		addps	xmm0, _ps_sincos_p0
    		mulps	xmm0, xmm1
     
    		ret		16
    	}
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // am_cos_ss
     
    __m128 __declspec(naked) __stdcall am_cos_ss(__m128 x)
    {
    	__asm
    	{
    		movss	xmm1, _ps_am_inv_sign_mask
    		andps	xmm0, xmm1
    		addss	xmm0, _ps_am_pi_o_2
    		mulss	xmm0, _ps_am_2_o_pi
     
    		cvttss2si	ecx, xmm0
    		movss	xmm5, _ps_am_1
    		mov		edx, ecx
    		shl		edx, (31 - 1)
    		cvtsi2ss	xmm1, ecx
    		and		edx, 0x80000000
    		and		ecx, 0x1
     
    		subss	xmm0, xmm1
    		movss	xmm6, _sincos_masks[ecx * 4]
    		minss	xmm0, xmm5
     
    		movss	xmm1, _ps_sincos_p3
    		subss	xmm5, xmm0
     
    		andps	xmm5, xmm6
    		movss	xmm7, _ps_sincos_p2
    		andnps	xmm6, xmm0
    		mov		[esp - 4], edx
    		orps	xmm5, xmm6
    		movss	xmm0, xmm5
     
    		mulss	xmm5, xmm5
    		movss	xmm4, _ps_sincos_p1
    		movss	xmm2, xmm5
    		mulss	xmm5, xmm1
    		movss	xmm1, _ps_sincos_p0
    		addss	xmm5, xmm7
    		mulss	xmm5, xmm2
    		movss	xmm3, [esp - 4]
    		addss	xmm5, xmm4
    		mulss	xmm5, xmm2
    		orps	xmm0, xmm3
    		addss	xmm5, xmm1
    		mulss	xmm0, xmm5
     
    		ret		16
    	}
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // am_cos_ess
     
    __m128 __declspec(naked) __stdcall am_cos_ess(__m128 x)  // any x
    {
    	__asm
    	{
    		movss	xmm1, _ps_am_inv_sign_mask
    		movss	xmm2, _ps_am_pi_o_2
    		movss	xmm3, _ps_am_2_o_pi
    		andps	xmm0, xmm1
    		addss	xmm0, xmm2
    		mulss	xmm0, xmm3
     
    		pxor	xmm3, xmm3
    		movd	xmm5, _epi32_1
    		movss	xmm4, _ps_am_1
    		cvttps2dq	xmm2, xmm0
    		pand	xmm5, xmm2
    		movd	xmm1, _epi32_2
    		pcmpeqd	xmm5, xmm3
    		cvtdq2ps	xmm6, xmm2
    		pand	xmm2, xmm1
    		pslld	xmm2, (31 - 1)
     
    		subss	xmm0, xmm6
    		movss	xmm3, _ps_sincos_p3
    		minss	xmm0, xmm4
    		subss	xmm4, xmm0
    		andps	xmm0, xmm5
    		andnps	xmm5, xmm4
    		orps	xmm0, xmm5
     
    		movaps	xmm1, xmm0
    		movss	xmm4, _ps_sincos_p2
    		mulss	xmm0, xmm0
    		movss	xmm5, _ps_sincos_p1
    		orps	xmm1, xmm2
    		movaps	xmm7, xmm0
    		mulss	xmm0, xmm3
    		movss	xmm6, _ps_sincos_p0
    		addss	xmm0, xmm4
    		mulss	xmm0, xmm7
    		addss	xmm0, xmm5
    		mulss	xmm0, xmm7
    		addss	xmm0, xmm6
    		mulss	xmm0, xmm1
     
    		ret		16
    	}
    }

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Merci pour la réponse.
    Mais je suis trés étonné que GCC ou Visual ne l'utilise pas de base... Puisque c'est plus rapide et aussi précis.
    C'est bon à savoir.
    Tu ne connaitrai pas un papier qui liste ces fonctions asm qui plus rapide??
    Tien comme tu t'y connait bien. Que pense tu de cela ?
    http://ktd.club.fr/programmation/cpp-fastmath.php

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    Le problème, c'est qu'il n'y a pas que les PC dans la vie, et que Gcc, par exemple, est prévu pour être compilable sur certaines de ces plateformes "non personnelles"...

    Dés lors, prendre la décision d'utiliser des instructions propres à une famille de processeurs particulière, c'est, quelque part, prendre un pari qui menera à un certain "élitisme" (tu n'est pas assez bien pour m'utiliser, étant donné que tu n'utilise pas le bon processeur)...

    En plus, sur mon "antique" Athlon 1700 XP, la différence est de l'ordre de 0.03 à 0.06 en faveur de la fonction STL, sans différence de précision (mais bon, c'est une compilation perso de Gcc et de tout ce qui va avec )

    J'obtiens en effet les résultats suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    moyenne difference 0
    epsilon float 1.19209e-007
    cos 1.156
    asm_cos 1.172
     
    cos 1.125
    asm_cos 1.172
     
    cos 1.125
    asm_cos 1.172
     
    cos 1.14
    asm_cos 1.188
     
    cos 1.125
    asm_cos 1.172
     
    cos 1.14
    asm_cos 1.172
     
    cos 1.125
    asm_cos 1.188
     
    cos 1.125
    asm_cos 1.172
     
    cos 1.14
    asm_cos 1.172
     
    cos 1.125
    asm_cos 1.172
    Comme quoi, il ne faut jamais trop se fier à un benchmark que l'on n'a pas truqué soi meme (et pourtant, j'ai utilisé exactement ton code )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    ok merci.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Merci pour la réponse.
    Mais je suis trés étonné que GCC ou Visual ne l'utilise pas de base... Puisque c'est plus rapide et aussi précis.
    C'est bon à savoir.
    Tu ne connaitrai pas un papier qui liste ces fonctions asm qui plus rapide??
    Tien comme tu t'y connait bien. Que pense tu de cela ?
    http://ktd.club.fr/programmation/cpp-fastmath.php
    A première vue, c'est intéressant d'un point de vue algorithmique, pour battre de vitesse des librairies C/C++.
    Mais ça ne concurrence probablement pas des instructions assembleur spécifiques. Et encore moins des calculs SIMD.

    Et puis je me méfierais des instructions telles que "fV = (fValue<0.0) ? -fValue : fValue" qui risquent fort de faire un saut conditionnel et de briser e pipeline du processeur.

    Les instructions SSE/SSE2 n'ont pas de fonctions trigo ou logarithmique, d'où le rôle de l'approximate Math Library d'Intel.
    Mais y'a quand même la racine carrée, imbattable...

    Si tu as l'aide de Visual, entre "SSE" dans l'index, et tu verras tous les intrasics.

    Citation Envoyé par koala01
    Le problème, c'est qu'il n'y a pas que les PC dans la vie, et que Gcc, par exemple, est prévu pour être compilable sur certaines de ces plateformes "non personnelles"...
    Mais quand-même, GCC a des options spécifiques pour optimiser sur divers processeurs (-march, -msse...). A quoi bon ces options alors?
    Mais en l'occurence, je crois que c'est un problème de bibliothèque plus que de compilo. Le compilo C++ d'Intel sous Windows venant par exemple avec sa propre lib mathématique.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par koala01 Voir le message

    Comme quoi, il ne faut jamais trop se fier à un benchmark que l'on n'a pas truqué soi meme (et pourtant, j'ai utilisé exactement ton code )
    Hé mais euh... j'ai rien truqué...
    Ca me rassure que tu n'as pas les même resultats

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Mais je suis trés étonné que GCC ou Visual ne l'utilise pas de base... Puisque c'est plus rapide et aussi précis.
    As-tu vérifié le dernier point dans tous les cas tordus sur tous les processeurs potentiellement cibles?

    En ce qui concerne gcc, il doit y avoir des raisons que tu ignores (par exemple, la doc que j'ai précise que l'argument de FSIN doit se trouver entre -2^63 et 2^63) parce que -ffast-math génère des FSIN sans problèmes.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    As-tu vérifié le dernier point dans tous les cas tordus sur tous les processeurs potentiellement cibles?

    En ce qui concerne gcc, il doit y avoir des raisons que tu ignores (par exemple, la doc que j'ai précise que l'argument de FSIN doit se trouver entre -2^63 et 2^63) parce que -ffast-math génère des FSIN sans problèmes.
    Euh non. Je ne connait pas tout les cas tordu
    C'est pour ça que j'ai fait un thread.
    C'est surtout par rapport à
    http://www.developpez.net/forums/sho...55&postcount=8

    Je voulais vérifier ses dire. Comme quoi c'est pas si simple

    Merci beaucoup

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu compiles bien en -O3 -march=native ?

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Mais quand-même, GCC a des options spécifiques pour optimiser sur divers processeurs (-march, -msse...). A quoi bon ces options alors?
    Mais en l'occurence, je crois que c'est un problème de bibliothèque plus que de compilo. Le compilo C++ d'Intel sous Windows venant par exemple avec sa propre lib mathématique.
    Ca, ca permet de créer des applications spécifiques pour une plateforme données, en utilisant un compilateur qui, lui, peut etre fournis pour toutes
    Citation Envoyé par Mongaulois Voir le message
    Hé mais euh... j'ai rien truqué...
    Ca me rassure que tu n'as pas les même resultats
    Je te rassure, je n'ai jamais pensé que tu avais truqué quoi que ce soit...

    Ce que je voulais dire, c'est qu'il y a tellement de paramètres qui peuvent faire que les résultats diffèrents d'une machine à l'autre que, en définitivie, le crédit à donner à un benchmark reste tout relatif

    D'ailleurs, je me suis rendu compte que les résultats fournis étaient ceux obtenus en mode debug, sans optimisation particulière...

    En effectuant le test en -O3 march=athlon, les résultats sont inversés (mais avec une moindre différence):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    moyenne difference 0
    epsilon float 1.19209e-007
    cos 1.046
    asm_cos 0.922
     
    cos 1.016
    asm_cos 0.937
     
    cos 1.016
    asm_cos 0.906
     
    cos 1.016
    asm_cos 0.922
     
    cos 1.031
    asm_cos 0.922
     
    cos 1.016
    asm_cos 0.937
     
    cos 1
    asm_cos 0.922
     
    cos 1.031
    asm_cos 0.922
     
    cos 1
    asm_cos 0.938
     
    cos 1.015
    asm_cos 0.922
    Tu vois qu'il ne faut apporter aucun crédit à un benchmark que tu n'a pas truqué toi meme
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Merci pour la réponse.
    Mais je suis trés étonné que GCC ou Visual ne l'utilise pas de base... Puisque c'est plus rapide et aussi précis.
    La raison pour laquelle MS VC++ ou GCC n'utilise pas de base les fonctions asm est que si, en fait, elles les utilise. Mais le standard C et C++ définit un comportement bien plus complet que le seul comportement des fonctions asm, ce qui impose d'autres opérations - notamment pour vérifier si le float ou le double n'est pas dénormalisé ou pour traiter les autres conditions d'erreur (range, ...). Donc, au final, le résultat de l'appel direct de la fonction asm est très similaire dans la plupart des cas, peut être très différent dans certains cas (et provoquer de fait des bugs très difficiles à localiser), mais est intrinsèquement plus rapide puisque tout un ensemble de vérifications importantes ne sont pas effectuées.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    D'ailleurs, je me suis rendu compte que les résultats fournis étaient ceux obtenus en mode debug, sans optimisation particulière...
    Des benchmarks en mode debug... C'est n'importe quoi.

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Des benchmarks en mode debug... C'est n'importe quoi.
    C'est pas du n'importe quoi, c'est juste de la distraction
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. recherche arborescence plus rapide
    Par e-steel dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 30/01/2006, 16h22
  2. Réponses: 16
    Dernier message: 19/05/2005, 16h20
  3. [FB1.5]Quelle est la requete la plus rapide ?
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 10/12/2004, 13h46
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo