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

Algorithmes et structures de données Discussion :

Pseudo code pour la somme de nombres impairs


Sujet :

Algorithmes et structures de données

  1. #21
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    J'aime bien celui-là !
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    r = 0
    for i in range(0,10000,10): # tous les entiers de 0 inclus à 10000 exclus avec un pas de 10
      r += (i * 4) + 1 + 3 + 7 + 9

    Le même en C/Java/C++ un peu optimisé (évite une multiplication et moins d'additions) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i, acc = 0 ;
    for (i=0 ; i < 10000 ; i+=10)
         acc += (i<<2) + 20 ;
    Tu amoindris la lisibilité et n'apporte aucune "optimisation". Un compilateur C en O1 ou plus produira un binaire similaire pour les deux écritures.


    Je pense que le code de meilleur qualité produit dans ce fil de discussion est le plus compréhensible :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    acc = 0
    for i in range(1, 9999 + 1): 
      if entier_naturel_impair(i) and !se_finit_par_5(i): 
        acc += i
    -- Yankel Scialom

  2. #22
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Tu amoindris la lisibilité et n'apporte aucune "optimisation". Un compilateur C en O1 ou plus produira un binaire similaire pour les deux écritures.
    C'est vrai, mais j'ai tendance à partir du principe que le compilateur ne fera pas quelque chose d'optimal, alors j'essai d'optimiser au niveau de mon code, même si je perds en lisibilité.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #23
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    lisible.cpp
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <cstdlib>
     
    int main(int argc, char** argv)
    {
        int acc = 0;
        for (int i=0 ; i < 10000 ; i+=10)
        {
    #ifndef OBFUSCATED
            acc += i*4 + 1 + 3 + 7 + 9;
    #else
            acc += (i<<2) + 20;
    #endif
        }
        return acc;
    }

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ g++ --version
    g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
    Copyright (C) 2010 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     
    $ g++ -O1 -S -o lisible.s lisible.cpp
    $ g++ -DOBFUSCATED -O1 -S -o obfuscated.s lisible.cpp

    lisible.s
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	.file	"lisible.cpp"
    	.text
    .globl main
    	.type	main, @function
    main:
    .LFB11:
    	.cfi_startproc
    	.cfi_personality 0x3,__gxx_personality_v0
    	movl	$20000000, %eax
    	ret
    	.cfi_endproc
    .LFE11:
    	.size	main, .-main
    	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-11)"
    	.section	.note.GNU-stack,"",@progbits

    obfuscated.s
    Code asm : 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
    	.file	"lisible.cpp"
    	.text
    .globl main
    	.type	main, @function
    main:
    .LFB11:
    	.cfi_startproc
    	.cfi_personality 0x3,__gxx_personality_v0
    	movl	$0, %edx
    	movl	$0, %eax
    .L2:
    	leal	20(%rax,%rdx,4), %eax
    	addl	$10, %edx
    	cmpl	$10000, %edx
    	jne	.L2
    	rep
    	ret
    	.cfi_endproc
    .LFE11:
    	.size	main, .-main
    	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-11)"
    	.section	.note.GNU-stack,"",@progbits

    Je m'attendais à un asm similaire, quelle surprise !
    Pour ceux qui ne lisent pas le x86, la boucle for "lisible" est remplacé par quelque chose d'équivalent à acc = 20000000;, la version "obfusquée" calcule acc.
    -- Yankel Scialom

  4. #24
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	movl	$20000000, %eax
    	ret
    effectivement c'est assez énorme j'aurais pas pensé ça du tout non plus, le compilateur fait purement et simplement sauter la boucle et tout le calcul pour en venir finalement à ce que disait kolodz un peu plus tôt, sexy.

  5. #25
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    la seule chose qui change vraiment dans le code que tu testes c'est "<<" au lieu de "*".
    Ce qui voudrait donc dire que gcc n'est pas capable de l'optimiser.

    Est ce que c'est aussi le cas avec une version récente de gcc (4.4 semble faire très vieux maintenant) ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #26
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Et que donne le même exercice, si la borne supérieure est une variable.
    C.a.d, bâtir une fonction qui donne la somme des entiers impairs, et non multiples de 5, entre 1 et n.

    ... et ma proposition :
    f(n) = n*(n+1)/2 - E(n/2)*E((n+1)/2)/2*2 - E(n/5)*E((n+1)/5)/2*5 +E(n/10)*E((n+1)/10)/2*10
    où E() est la fonction partie entière.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #27
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Est ce que c'est aussi le cas avec une version récente de gcc (4.4 semble faire très vieux maintenant) ?
    Il y a aussi le niveau d'optimisation : GCC ne fait probablement rien d'agressif en -O1, contrairement à du -O3. Les résultats en tout cas sont très différents avec Intel C++ (sous Windows), même code que prgasp77.

    icl /O3 /FAsc /DOBFUSCATED test.cpp

    Code x : 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
    ; mark_description "Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.3.208 Build 20150";
    ; mark_description "407";
    ; mark_description "-O3 -FAsc -DOBFUSCATED";
        OPTION DOTNAME
    ;ident "-defaultlib:libcpmt"
    _TEXT    SEGMENT      'CODE'
    ;    COMDAT main
    TXTST0:
    ; -- Begin  main
    ;main    ENDS
    _TEXT    ENDS
    _TEXT    SEGMENT      'CODE'
    ;    COMDAT main
    ; mark_begin;
           ALIGN     16
        PUBLIC main
    main    PROC 
    ; parameter 1: ecx
    ; parameter 2: rdx
    .B1.1::                         ; Preds .B1.0
    
    ;;; {
    
    L1::
                                                               ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00000 48 83 ec 28      sub rsp, 40                            ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00004 33 d2            xor edx, edx                           ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00006 b9 03 00 00 00   mov ecx, 3                             ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      0000b e8 fc ff ff ff   call __intel_new_feature_proc_init     ;c:\Users\Thibaut\Desktop\test.cpp:4.1
                                    ; LOE rbx rbp rsi rdi r12 r13 r14 r15 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
    .B1.6::                         ; Preds .B1.1
      00010 0f ae 5c 24 20   stmxcsr DWORD PTR [32+rsp]             ;c:\Users\Thibaut\Desktop\test.cpp:4.1
    
    ;;;     int acc = 0;
    
      00015 33 c0            xor eax, eax                           ;c:\Users\Thibaut\Desktop\test.cpp:5.13
    
    ;;;     for (int i=0 ; i < 10000 ; i+=10)
    
      00017 45 33 c0         xor r8d, r8d                           ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      0001a 81 4c 24 20 40 
            80 00 00         or DWORD PTR [32+rsp], 32832           ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00022 33 c9            xor ecx, ecx                           ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      00024 0f ae 54 24 20   ldmxcsr DWORD PTR [32+rsp]             ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00029 33 d2            xor edx, edx                           ;c:\Users\Thibaut\Desktop\test.cpp:6.5
                                    ; LOE rbx rbp rsi rdi r12 r13 r14 r15 eax edx ecx r8d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
    .B1.2::                         ; Preds .B1.2 .B1.6
      0002b 41 ff c0         inc r8d                                ;c:\Users\Thibaut\Desktop\test.cpp:6.5
    
    ;;;     {
    ;;; #ifndef OBFUSCATED
    ;;;         acc += i*4 + 1 + 3 + 7 + 9;
    ;;; #else
    ;;;         acc += (i<<2) + 20;
    
      0002e 44 8d 0c 95 14 
            00 00 00         lea r9d, DWORD PTR [20+rdx*4]          ;c:\Users\Thibaut\Desktop\test.cpp:11.25
      00036 41 03 c1         add eax, r9d                           ;c:\Users\Thibaut\Desktop\test.cpp:11.9
      00039 44 8d 14 95 3c 
            00 00 00         lea r10d, DWORD PTR [60+rdx*4]         ;c:\Users\Thibaut\Desktop\test.cpp:11.20
      00041 41 03 ca         add ecx, r10d                          ;c:\Users\Thibaut\Desktop\test.cpp:11.9
      00044 83 c2 14         add edx, 20                            ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      00047 41 81 f8 f4 01 
            00 00            cmp r8d, 500                           ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      0004e 72 db            jb .B1.2 ; Prob 99%                    ;c:\Users\Thibaut\Desktop\test.cpp:6.5
                                    ; LOE rbx rbp rsi rdi r12 r13 r14 r15 eax edx ecx r8d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
    .B1.3::                         ; Preds .B1.2
      00050 03 c1            add eax, ecx                           ;c:\Users\Thibaut\Desktop\test.cpp:11.9
    
    ;;; #endif
    ;;;     }
    ;;;     return acc;
    
      00052 48 83 c4 28      add rsp, 40                            ;c:\Users\Thibaut\Desktop\test.cpp:14.12
      00056 c3               ret                                    ;c:\Users\Thibaut\Desktop\test.cpp:14.12
      00057 66 0f 1f 84 00 
            00 00 00 00      ALIGN     16
                                    ; LOE
    .B1.4::
    ; mark_end;
    main ENDP
    ;main    ENDS
    _TEXT    ENDS
    .xdata    SEGMENT  DWORD   READ  ''
    ;    COMDAT .xdata$main
        ALIGN 004H
    .unwind.main.B1_B3    DD    66561
        DD    16900
    ;.xdata$main    ENDS
    .xdata    ENDS
    .pdata    SEGMENT  DWORD   READ  ''
    ;    COMDAT .pdata$main
        ALIGN 004H
    .pdata.main.B1_B3    DD    imagerel .B1.1
        DD    imagerel .B1.4
        DD    imagerel .unwind.main.B1_B3
    ;.pdata$main    ENDS
    .pdata    ENDS
    _DATA    SEGMENT      'DATA'
    _DATA    ENDS
    ; -- End  main
    _DATA    SEGMENT      'DATA'
    _DATA    ENDS
    EXTRN    __intel_new_feature_proc_init:PROC
    EXTRN    __ImageBase:PROC
        INCLUDELIB <libmmt>
        INCLUDELIB <LIBCMT>
        INCLUDELIB <libirc>
        INCLUDELIB <svml_dispmt>
        INCLUDELIB <OLDNAMES>
        INCLUDELIB <libdecimal>
        END

    icl /O3 /FAsc test.cpp

    Code x : 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
    ; mark_description "Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.3.208 Build 20150";
    ; mark_description "407";
    ; mark_description "-O3 -FAsc";
        OPTION DOTNAME
    ;ident "-defaultlib:libcpmt"
    _TEXT    SEGMENT      'CODE'
    ;    COMDAT main
    TXTST0:
    ; -- Begin  main
    ;main    ENDS
    _TEXT    ENDS
    _TEXT    SEGMENT      'CODE'
    ;    COMDAT main
    ; mark_begin;
           ALIGN     16
        PUBLIC main
    main    PROC 
    ; parameter 1: ecx
    ; parameter 2: rdx
    .B1.1::                         ; Preds .B1.0
    
    ;;; {
    
    L1::
                                                               ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00000 48 83 ec 28      sub rsp, 40                            ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00004 33 d2            xor edx, edx                           ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00006 b9 03 00 00 00   mov ecx, 3                             ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      0000b e8 fc ff ff ff   call __intel_new_feature_proc_init     ;c:\Users\Thibaut\Desktop\test.cpp:4.1
                                    ; LOE rbx rbp rsi rdi r12 r13 r14 r15 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
    .B1.6::                         ; Preds .B1.1
      00010 0f ae 5c 24 20   stmxcsr DWORD PTR [32+rsp]             ;c:\Users\Thibaut\Desktop\test.cpp:4.1
    
    ;;;     int acc = 0;
    ;;;     for (int i=0 ; i < 10000 ; i+=10)
    ;;;     {
    ;;; #ifndef OBFUSCATED
    ;;;         acc += i*4 + 1 + 3 + 7 + 9;
    
      00015 b8 a0 00 00 00   mov eax, 160                           ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      0001a 66 0f ef c0      pxor xmm0, xmm0                        ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      0001e 81 4c 24 20 40 
            80 00 00         or DWORD PTR [32+rsp], 32832           ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      00026 0f ae 54 24 20   ldmxcsr DWORD PTR [32+rsp]             ;c:\Users\Thibaut\Desktop\test.cpp:4.1
      0002b 66 0f 6e c8      movd xmm1, eax                         ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      0002f 33 c0            xor eax, eax                           ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      00031 66 0f 70 d1 00   pshufd xmm2, xmm1, 0                   ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00036 66 0f 6f 0d 00 
            00 00 00         movdqa xmm1, XMMWORD PTR [_2il0floatpacket.0] ;c:\Users\Thibaut\Desktop\test.cpp:9.34
                                    ; LOE rbx rbp rsi rdi r12 r13 r14 r15 eax xmm0 xmm1 xmm2 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
    .B1.2::                         ; Preds .B1.2 .B1.6
      0003e 66 0f 6f d9      movdqa xmm3, xmm1                      ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00042 66 0f 6f e2      movdqa xmm4, xmm2                      ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00046 66 0f fe da      paddd xmm3, xmm2                       ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      0004a 66 0f fe c8      paddd xmm1, xmm0                       ;c:\Users\Thibaut\Desktop\test.cpp:9.9
      0004e 66 0f fe e3      paddd xmm4, xmm3                       ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00052 66 0f fe cb      paddd xmm1, xmm3                       ;c:\Users\Thibaut\Desktop\test.cpp:9.9
      00056 66 0f fe cc      paddd xmm1, xmm4                       ;c:\Users\Thibaut\Desktop\test.cpp:9.9
      0005a 83 c0 10         add eax, 16                            ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      0005d 66 0f fe e2      paddd xmm4, xmm2                       ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00061 66 0f 6f c1      movdqa xmm0, xmm1                      ;c:\Users\Thibaut\Desktop\test.cpp:9.9
      00065 66 0f 6f ca      movdqa xmm1, xmm2                      ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00069 66 0f fe c4      paddd xmm0, xmm4                       ;c:\Users\Thibaut\Desktop\test.cpp:9.9
      0006d 66 0f fe cc      paddd xmm1, xmm4                       ;c:\Users\Thibaut\Desktop\test.cpp:9.34
      00071 3d e0 03 00 00   cmp eax, 992                           ;c:\Users\Thibaut\Desktop\test.cpp:6.5
      00076 72 c6            jb .B1.2 ; Prob 99%                    ;c:\Users\Thibaut\Desktop\test.cpp:6.5
                                    ; LOE rbx rbp rsi rdi r12 r13 r14 r15 eax xmm0 xmm1 xmm2 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
    .B1.3::                         ; Preds .B1.2
      00078 66 0f 6f c8      movdqa xmm1, xmm0                      ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      0007c 66 0f 73 d9 08   psrldq xmm1, 8                         ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      00081 66 0f fe c1      paddd xmm0, xmm1                       ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      00085 66 0f 6f d0      movdqa xmm2, xmm0                      ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      00089 66 0f 73 d2 20   psrlq xmm2, 32                         ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      0008e 66 0f fe c2      paddd xmm0, xmm2                       ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      00092 66 0f 7e c0      movd eax, xmm0                         ;c:\Users\Thibaut\Desktop\test.cpp:5.13
      00096 05 00 dd 04 00   add eax, 318720                        ;c:\Users\Thibaut\Desktop\test.cpp:9.9
    
    ;;; #else
    ;;;         acc += (i<<2) + 20;
    ;;; #endif
    ;;;     }
    ;;;     return acc;
    
      0009b 48 83 c4 28      add rsp, 40                            ;c:\Users\Thibaut\Desktop\test.cpp:14.12
      0009f c3               ret                                    ;c:\Users\Thibaut\Desktop\test.cpp:14.12
            ALIGN     16
                                    ; LOE
    .B1.4::
    ; mark_end;
    main ENDP
    ;main    ENDS
    _TEXT    ENDS
    .xdata    SEGMENT  DWORD   READ  ''
    ;    COMDAT .xdata$main
        ALIGN 004H
    .unwind.main.B1_B3    DD    66561
        DD    16900
    ;.xdata$main    ENDS
    .xdata    ENDS
    .pdata    SEGMENT  DWORD   READ  ''
    ;    COMDAT .pdata$main
        ALIGN 004H
    .pdata.main.B1_B3    DD    imagerel .B1.1
        DD    imagerel .B1.4
        DD    imagerel .unwind.main.B1_B3
    ;.pdata$main    ENDS
    .pdata    ENDS
    _DATA    SEGMENT      'DATA'
    _DATA    ENDS
    ; -- End  main
    _RDATA    SEGMENT     READ  'DATA'
    _2il0floatpacket.0    DD    000000014H,00000003cH,000000064H,00000008cH
    _RDATA    ENDS
    _DATA    SEGMENT      'DATA'
    _DATA    ENDS
    EXTRN    __intel_new_feature_proc_init:PROC
    EXTRN    __ImageBase:PROC
        INCLUDELIB <libmmt>
        INCLUDELIB <LIBCMT>
        INCLUDELIB <libirc>
        INCLUDELIB <svml_dispmt>
        INCLUDELIB <OLDNAMES>
        INCLUDELIB <libdecimal>
        END

    Dans les deux cas, il fait une boucle (instruction jb), il arrive à la vectoriser sans définir OBFUSCATED (coefficient d'accélération estimé : 2,341797), pas du tout en définissant cette macro (0,876465). Je ne sais pas exactement à quoi fait référence ce coefficient, mais il semble indiquer que la version la plus simple du code soit plus facile à optimiser. J'espérais un meilleur résultat en tournant les optimisations à fond, mais bon…
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #28
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Pour ma part j'avais fait le test en Java et le temps d'exécution était exactement le même.


    Citation Envoyé par tbc92 Voir le message
    Et que donne le même exercice, si la borne supérieure est une variable.
    C.a.d, bâtir une fonction qui donne la somme des entiers impairs, et non multiples de 5, entre 1 et n.
    Le compilateur ne pourra pas supprimer la boucle car il ne connaîtra pas la borne sup.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  9. #29
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    effectivement c'est assez énorme j'aurais pas pensé ça du tout non plus, le compilateur fait purement et simplement sauter la boucle et tout le calcul pour en venir finalement à ce que disait kolodz un peu plus tôt, sexy.
    En même temps, je dis rarement de la me*de :p

    Sinon, c'est quand que je vois un code sans boucle du même style que :
    Code java : 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
    private static int sumAsO1Algo(int n) {
    		n=n-1; //On retir un car prend le cas où n est non inclut pour être identique à l'autre algo.
    		// On veux savoir quel est l'unité final
    		int reste = n % 10;
    		// Si on est dans le cas où on est divisible par 10, pas besoin de se prendre la tête on applique la formule.
    		if (reste == 0 ) {
    			return (n / 5) * n;
    		} else {
    			// Mince ce n'est pas le cas parfait ! On fait une version étendu
    			// On va compter ce qui est après le cas parfait ! Et l'ajouter ... C'est pas si long !
    			int topPart=0;
    			// On veux l'arrondi au dizaine inférieur pour faire les belles additions !
    			int arrondi = n/10*10;
    			if(reset>=1){
    				topPart+=arrondi+1;
    			}
    			if(reset>=3){
    				topPart+=arrondi+3;
    			}
    			if(reset>=7){
    				topPart+=arrondi+7;
    			}
    			if(reset>=9){
    				topPart+=arrondi+9;
    			}
    			return (arrondi / 5) * arrondi+topPart;
    		}
    	}
    Certes le else n'est pas sexy, mais toujours plus rapide qu'une boucle for !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  10. #30
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par kolodz Voir le message
    En même temps, je dis rarement de la me*de :p
    juste pour précision et au risque de te décevoir, c'est l'optim de gcc que je qualifiais de sexy

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Somme de nombre pour une date maximum
    Par HurGeek dans le forum SQL
    Réponses: 7
    Dernier message: 22/05/2012, 17h30
  2. VB6, code pour éffectuer la racine carré d'un nombre
    Par nap91 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/05/2011, 13h20
  3. Réponses: 1
    Dernier message: 08/04/2009, 12h17

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