Cette question continue sur ma question ici (sur les conseils de Mystique):
C code de la performance de la boucle de
Continuant sur ma question, quand j'utilise les paniers des instructions au lieu de scalaire instructions le code à l'aide de intrinsèques serait très proche:
for(int i=0; i<size; i+=16) {
y1 = _mm_load_ps(output[i]);
…
y4 = _mm_load_ps(output[i+12]);
for(k=0; k<ksize; k++){
for(l=0; l<ksize; l++){
w = _mm_set_ps1(weight[i+k+l]);
x1 = _mm_load_ps(input[i+k+l]);
y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
…
x4 = _mm_load_ps(input[i+k+l+12]);
y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
}
}
_mm_store_ps(&output[i],y1);
…
_mm_store_ps(&output[i+12],y4);
}
Les performances mesurées de ce noyau est d'environ 5,6 FP opérations par cycle, bien que je m'attends à ce qu'il soit exactement 4 fois les performances de la version scalaire, c'est à dire 4.1,6=6,4 FP ops par cycle.
En prenant le déplacement du poids du facteur en compte (merci pour cette remarque), le programme ressemble à:
Il ressemble à l'horaire ne change pas, même si il ya un supplément d'instruction après l' movss
opération qui se déplace le scalaire de la valeur de poids pour le XMM registre et l'utilise ensuite shufps
pour copier cette valeur scalaire dans l'ensemble du vecteur. Il semble que le poids de vecteur est prêt à être utilisé pour l' mulps
de temps en prenant la latence de commutation de charge pour le domaine de virgule flottante en compte, donc il ne devrait pas encourir aucune latence supplémentaire.
L' movaps
(aligné, paniers déplacer),addps
& mulps
instructions qui sont utilisés dans cette noyau (vérifié avec le code d'assemblée) ont le même temps de latence et de débit comme leur scalaire versions, donc il ne devrait pas encourir aucune latence supplémentaire.
Quelqu'un at-il une idée d'où cela supplémentaires cycle par 8 cycles est dépensé, en supposant que le maximum de la performance de ce noyau peut obtenir est de 6.4 FP ops par cycle et il est en cours d'exécution à 5.6 PF ops par cycle?
Merci à l'avance!
Au passage voici ce que les effectifs de l'assemblée ressemble:
…
Block x:
movapsx (%rax,%rcx,4), %xmm0
movapsx 0x10(%rax,%rcx,4), %xmm1
movapsx 0x20(%rax,%rcx,4), %xmm2
movapsx 0x30(%rax,%rcx,4), %xmm3
movssl (%rdx,%rcx,4), %xmm4
inc %rcx
shufps $0x0, %xmm4, %xmm4 {fill weight vector}
cmp $0x32, %rcx
mulps %xmm4, %xmm0
mulps %xmm4, %xmm1
mulps %xmm4, %xmm2
mulps %xmm3, %xmm4
addps %xmm0, %xmm5
addps %xmm1, %xmm6
addps %xmm2, %xmm7
addps %xmm4, %xmm8
jl 0x401ad6 <Block x>
…