Sur ARM (un chromebook avec Debian dessus), j'obtiens de meilleurs score pour la version "CMOV" sur le main que j'ai mis au-dessus, les valeurs sont loader bien avant le CMOV, donc pas besoin de prédiction de valeur, elles sont dispo lors du cmov (il faudrait faire du profiling, j'ai la flème).
C3 et C4 sont 2 versions CMOV, les autres utilisent les branchements. C5, c'est le code que tu as mis dans l'autre commentaire.
$ cat /proc/cpuinfo
processor : 0
BogoMIPS : 26.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4[ . . . 8 cores qui semblent identiques ]
size_tfind_int_c3(constintk,constint*v,constsize_tn){unsignedintmask=0;size_ti=0;for(;i<n-8;){mask=v[i]!=k?mask:1;mask=v[i+1]!=k?mask:2;mask=v[i+2]!=k?mask:4;mask=v[i+3]!=k?mask:8;mask=v[i+4]!=k?mask:16;mask=v[i+5]!=k?mask:32;mask=v[i+6]!=k?mask:64;mask=v[i+7]!=k?mask:128;i+=8;if(mask!=0)i+=n;__builtin_prefetch(v+i+512,0,1);}i-=n+8;if(mask==0)returnn;if(mask==1)returni;if(mask==2)returni+1;if(mask==4)returni+2;if(mask==8)returni+3;if(mask==16)returni+4;if(mask==32)returni+5;if(mask==64)returni+6;if(mask==128)returni+7;}size_tfind_int_c4(constintk,constint*v,constsize_tn){size_ti=0;// size_t n2 = n >> 1;// const long* vl = (const long*)v;// const long kl = (long)(((long)k>>32) + k);unsignedintindex=0;for(;i<=n;i+=8,v+=8){index=0;__builtin_prefetch(v+256);index=v[0]!=k?index:1;index=v[1]!=k?index:1;index=v[2]!=k?index:1;index=v[3]!=k?index:1;index=v[4]!=k?index:1;index=v[5]!=k?index:1;index=v[6]!=k?index:1;index=v[7]!=k?index:1;if(index==1){break;}}if(index==0)returni;elsefor(intj=0;i<8;j++){if(v[j]==k)returni+j;}}size_tfind_int_c5(constintk,constint*v,constsize_tn){size_ti=0;for(;n-i>=8;i+=8,v+=8){__builtin_prefetch(v+256);//54/148if(v[0]==k)returni;if(v[1]==k)returni+1;if(v[2]==k)returni+2;if(v[3]==k)returni+3;if(v[4]==k)returni+4;if(v[5]==k)returni+5;if(v[6]==k)returni+6;if(v[7]==k)returni+7;}for(;i!=n;i++,v++)if(v[0]==k)returni;returnn;}
Le fait que C3 soit plus rapide que C4 est contre-intuitif, mais le prefetch n'est pas placé aux mêmes endroits. Je m'attendais à de plus de différences...
Perso j'adore ce Chromebook, pour 250 EUR t'as un Linux sur ARM (certes, ça ne vaut pas un RPi). Mais il y a un très bon écran.
[^] # Re: Sans SSE
Posté par YBoy360 (site web personnel) . En réponse au journal Recherche de valeur dans un tableau et l'écosystème des compilateurs C++. Évalué à 1. Dernière modification le 08 octobre 2021 à 14:40.
Sur ARM (un chromebook avec Debian dessus), j'obtiens de meilleurs score pour la version "CMOV" sur le main que j'ai mis au-dessus, les valeurs sont loader bien avant le CMOV, donc pas besoin de prédiction de valeur, elles sont dispo lors du cmov (il faudrait faire du profiling, j'ai la flème).
C3 et C4 sont 2 versions CMOV, les autres utilisent les branchements. C5, c'est le code que tu as mis dans l'autre commentaire.
Le fait que C3 soit plus rapide que C4 est contre-intuitif, mais le prefetch n'est pas placé aux mêmes endroits. Je m'attendais à de plus de différences...
Perso j'adore ce Chromebook, pour 250 EUR t'as un Linux sur ARM (certes, ça ne vaut pas un RPi). Mais il y a un très bon écran.