_Sil_ a écrit 5 commentaires

  • [^] # Re: creation des threads + cache

    Posté par  . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.

    Sur un quadcore
    Intel(R) Xeon(R) CPU X3350 @ 2.66GHz

    Les résultats sont assez aléatoires, même si rien d'autre de gourmand ne tourne.


    inplace sequential prediction : 0.402000 ms
    inplace sequential prediction += : 0.354000 ms
    outplace sequential prediction : 1.446000 ms
    inplace parallel prediction += using 1 threads: 2.075000 ms
    inplace parallel prediction += using 2 threads: 0.966000 ms
    inplace parallel prediction += using 4 threads: 0.837000 ms
    inplace parallel prediction += using 8 threads: 1.835000 ms
    inplace parallel prediction += using 16 threads: 0.755000 ms
    outplace parallel prediction using 1 threads: 2.175000 ms
    outplace parallel prediction using 2 threads: 1.123000 ms
    outplace parallel prediction using 4 threads: 0.774000 ms
    outplace parallel prediction using 8 threads: 0.853000 ms
    outplace parallel prediction using 16 threads: 0.771000 ms


    ou alors



    inplace sequential prediction : 0.310000 ms
    inplace sequential prediction += : 0.276000 ms
    outplace sequential prediction : 1.365000 ms
    inplace parallel prediction += using 1 threads: 2.280000 ms
    inplace parallel prediction += using 2 threads: 1.083000 ms
    inplace parallel prediction += using 4 threads: 0.632000 ms
    inplace parallel prediction += using 8 threads: 0.507000 ms
    inplace parallel prediction += using 16 threads: 0.610000 ms
    outplace parallel prediction using 1 threads: 1.108000 ms
    outplace parallel prediction using 2 threads: 1.177000 ms
    outplace parallel prediction using 4 threads: 1.319000 ms
    outplace parallel prediction using 8 threads: 0.628000 ms
    outplace parallel prediction using 16 threads: 0.724000 ms


    Je pense que les temps sont beaucoup trop court et la moindre préemption/interruption fausse le résultat.

    Du coup je me demande si c'est pas simplement un patch RT la solution
  • [^] # Re: Assembleur

    Posté par  . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.

    ce qui de doute façon donnerait le même résultat
    -> Non, je sors.
  • [^] # Re: Assembleur

    Posté par  . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.

    Pour les quelques uns qui ont suivi : dans la version "+=" , il additionne finalement
    xmm4, xmm1 et xmm0 et non pas xmm4, xmm2 et xmm1 (ce qui de doute façon donnerait le même résultat !)
  • [^] # Re: Assembleur

    Posté par  . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.

    Pour information le code généré pour la version avec des "+" .
    Je ne suis pas un grand spécialiste, mais il doit être difficile de faire beaucoup mieux ?
    Le "problème" est bien a chercher dans l'overhead introduit par les threads.


    yvar1Temp[i] = yvar1[i] + yvar2[i] + yvar3[i];

    movsd (%r8),%xmm3
    movhpd 0x8(%rcx,%rbx,1),%xmm1
    movhpd 0x8(%r8),%xmm3
    movapd %xmm1,%xmm0
    addpd %xmm3,%xmm0
    movsd 0x0(%rbp),%xmm3
    movhpd 0x8(%rbp),%xmm3
    addpd %xmm3,%xmm0
    movlpd %xmm0,(%rdx,%rbx,1)
    movhpd %xmm0,0x8(%rdx,%rbx,1)
  • [^] # Re: Assembleur

    Posté par  . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.

    Une petite bizarrerie de gcc (4.5.1) dans le code généré (O3):


    yvar1[i] += yvar2[i] + yvar3[i];
    4007f0: f2 0f 10 09 movsd (%rcx),%xmm1
    ...
    4007f7: f2 0f 10 10 movsd (%rax),%xmm2
    4007fb: 66 0f 16 49 08 movhpd 0x8(%rcx),%xmm1
    400800: f2 0f 10 22 movsd (%rdx),%xmm4
    400804: 66 0f 16 50 08 movhpd 0x8(%rax),%xmm2
    400809: 66 0f 16 62 08 movhpd 0x8(%rdx),%xmm4
    40080e: 66 0f 28 c1 movapd %xmm1,%xmm0
    400812: 66 0f 28 ca movapd %xmm2,%xmm1
    400816: 66 0f 58 cc addpd %xmm4,%xmm1
    40081a: 66 0f 58 c1 addpd %xmm1,%xmm0
    40081e: 66 0f 13 01 movlpd %xmm0,(%rcx)
    400822: 66 0f 17 41 08 movhpd %xmm0,0x8(%rcx)


    Il utilise bien les instructions SSE.
    Par contre, si je comprend bien, il charge un couple de y1, y2,y3 dans les registres xmm1, xmm2 et xmm4.
    Puis met xmm1 dans xmm0
    Puis met xmm2 dans xmm1
    Puis additionne xmm4 + xmm1 + xmm2.

    Dites monsieur gcc, ca sert à quoi ce déplacement des registres 2 et 1 dans 1 et 0 ??

    C'est probablement pour cela que tu vois une différence (injustifiable à mon avis) entre le "+=" et les "+" .
    Il ne fait pas cette entourloupe pour pour la série de "+" .