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
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 !)
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.
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 "+" .
[^] # Re: creation des threads + cache
Posté par _Sil_ . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.
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 _Sil_ . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.
-> Non, je sors.
[^] # Re: Assembleur
Posté par _Sil_ . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.
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 _Sil_ . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.
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 _Sil_ . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.
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 "+" .