Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3518 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Comment inverser les bits d'un octet ?

n°842562
christophe​_d13
L'efficacité à tout prix.
Posté le 05-09-2004 à 09:16:58  profilanswer
 

Reprise du message précédent :
Bien vu mais bon c'est un premier jet, je n'ai pas cherché à faire le plus rapide. Juste expliquer en ASM ma méthode.
Up> Et puis il fallait vraiment voir les 3 étapes. Mais ceci dit en ajoutant la rotation, on gagne 2 cycles. soit 8 cycles seulement.
Il est encore posible d'améliorer le code... D'après mon analyse je pense que l'on peut tomber le nombre de rotation à 3 à cause de la récurence et il doit être possible de grouper l'étape 1 et 2.
 
Up #2> Et bien c'est fait, 7 cycles seulement, simplement en analyse.
 
Le code et l'explication

Code :
  1. mov al, Source      //al = 76543210
  2. mov bl, al          //al = 76543210
  3. rol al, 1           //al = 65432107
  4. rol bl, 5           //bl = 21076543
  5. and al, 0x99        //al = 6xx32xx7
  6. and bl, 0x66        //bl = x10xx54x
  7. or  al, bl          //al = 61032547
  8. mov bl, al          //bl = 61032547
  9.            
  10. and al, 0x55        //al = x1x3x5x7
  11. and bl, 0xAA        //bl = 6x0x2x4x
  12. rol bl, 2           //bl = 0x2x4x6x
  13. or al, bl           //al = 01234567


 
Aucune optimisation de bas niveau, juste une reflexion sur l'algo.
Donc, 7 cycles.


Message édité par christophe_d13 le 05-09-2004 à 09:43:06
mood
Publicité
Posté le 05-09-2004 à 09:16:58  profilanswer
 

n°843002
christophe​_d13
L'efficacité à tout prix.
Posté le 06-09-2004 à 00:05:40  profilanswer
 

qui dit mieux ?

n°843059
prorel
Posté le 06-09-2004 à 03:39:48  profilanswer
 

d'apres ma doc (mais je ne garantie pas sa fiabilité a 100%)
sur le P4, le "rol reg,immedia8" fait 4 cycles
 
donc j'arriverais a 21 cycles

n°843078
christophe​_d13
L'efficacité à tout prix.
Posté le 06-09-2004 à 09:13:01  profilanswer
 

Quand je dis 7 cycles, c'est suite à une mesure sur un AthlonXP Barton.

n°844292
prorel
Posté le 07-09-2004 à 15:57:20  profilanswer
 

ah beb oui mais si tu triche :D :D

n°844741
christophe​_d13
L'efficacité à tout prix.
Posté le 08-09-2004 à 09:30:24  profilanswer
 

moi je triche ??? !!!
Fait une mesure sur un P4 et dis-moi ce qu'il en ressort.

n°845001
prorel
Posté le 08-09-2004 à 13:52:36  profilanswer
 

meuh je rigole, faut pas piquer la mouche comme ca!!
 
si tu le dit, je te crois

n°845326
christophe​_d13
L'efficacité à tout prix.
Posté le 08-09-2004 à 19:14:12  profilanswer
 

prorel> C'est ironique
Tu ne l'as pas entendu ? Fallait mettre le son plus fort !
 
Ceci dit, si quelqu'un pouvait faire une mesure sur P4...

n°845620
prorel
Posté le 09-09-2004 à 02:40:00  profilanswer
 

je vais essayer
faut que je retourve les ptits bout de prog pour le calcul du temps

n°845635
christophe​_d13
L'efficacité à tout prix.
Posté le 09-09-2004 à 08:07:31  profilanswer
 

Code :
  1. {
  2.         DWORD dw1, dw2, dwCount1, dwCount2;
  3.         unsigned char Source;
  4.         char szTmp[256];
  5.         #define COUNTLEN    10000000
  6.         Source = 156;
  7.         __asm {
  8.             rdtsc
  9.             mov dw1, eax
  10.             mov ecx, COUNTLEN
  11.             xor eax, eax
  12.            
  13.         loop_reorder1:
  14.             mov al, Source      //al = 76543210
  15.             mov bl, al          //al = 65432107
  16.             rol al, 1
  17.             rol bl, 5           //bl = 21076543
  18.             and al, 0x99        //al = 6xx32xx7
  19.             and bl, 0x66        //bl = x10xx54x
  20.             or  al, bl          //al = 61032547
  21.             mov bl, al          //bl = 61032547
  22.            
  23.             and al, 0x55        //al = x1x3x5x7
  24.             and bl, 0xAA        //bl = 6x0x2x4x
  25.             rol bl, 2           //bl = 0x2x4x6x
  26.             or al, bl           //al = 01234567
  27.             dec ecx
  28.             jnz loop_reorder1
  29.             mov Source, al
  30.             rdtsc
  31.             mov dw2, eax
  32.         }
  33.         dwCount1 = dw2 - dw1;
  34.         __asm {
  35.             rdtsc
  36.             mov dw1, eax
  37.             mov ecx, COUNTLEN
  38.             xor eax, eax
  39.         loop_reorder2:
  40.             dec ecx
  41.             jnz loop_reorder2
  42.             rdtsc
  43.             mov dw2, eax
  44.         }
  45.         dwCount2 = dw2 - dw1;
  46.         sprintf ( szTmp, "%4.1f cycles", ((float)(dwCount1-dwCount2))/COUNTLEN );
  47.         MessageBox ( GetFocus ( ), szTmp, "DebugBox", MB_OK );
  48.         return 0;
  49.     }

mood
Publicité
Posté le 09-09-2004 à 08:07:31  profilanswer
 

n°846722
prorel
Posté le 10-09-2004 à 11:04:12  profilanswer
 

bien recu, je te donnerais les resultats

n°880846
g012
Posté le 23-10-2004 à 16:42:28  profilanswer
 

Bon bin puisque prorel a l'air de s'être perdu ;)
Sur mon p4b 2.4GHz: ça oscille entre 18 et 21 cycles.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Lire la valeur de la couleur d'un pixel en 800*600 en 32 bits ?conversion en bits
conversion des décimaux en bits[RESOLU]Convertir un entier en HEXA sur un nombre de bits
[PHP] Conversion fichier .tif en .png 24 bitsprogrammation 32 bits
Inverser l'axe Y de Graphics[debutant] 1 ko = 1000 ou 1024 octet ?
[Visual c++] convertir une taille en Octet automatiquement 2[Visual c++] convertir une taille en Octet automatiquement
Plus de sujets relatifs à : Comment inverser les bits d'un octet ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)