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

  FORUM HardWare.fr
  Programmation
  ASM

  [Concours n°4] A la recherche du bit perdu...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Concours n°4] A la recherche du bit perdu...

n°799947
christophe​_d13
L'efficacité à tout prix.
Posté le 19-07-2004 à 21:01:17  profilanswer
 

Voici un concours concret et assez court qui pourra servir à tous...
 
Il s'agit de lire un bit dans un flux d'octets (MP3). Cette une routine particulièrement utilisée dans les décodeurs.
C'est le code utilisé dans les flux MPEG.
 
La routine ci-dessous récupère un bit (pointé par BitBuffer_CurrentBit) du tableau BitBuffer et incrémente CurrentBit en appliquant également un ET de 4095 (tampon tournant).
 

Code :
  1. //Déclaration globale...
  2. unsigned char BitBuffer[4096];
  3. unsigned long BitBuffer_CurrentBit;
  4. unsigned long hget1bit ( void )
  5. {
  6.     unsigned char Bit;
  7.     //Récupération de l'octet en cours
  8.     Bit = BitBuffer[(BitBuffer_CurrentBit>>3)&4095];
  9.     //Récupération du bit nécessaire 1/2 : d‚calage
  10.     Bit = Bit>>(7-(BitBuffer_CurrentBit&7));
  11.     //Récupération du bit nécessaire 2/2 : masque
  12.     Bit = Bit&1;
  13.     //Augmente les positions
  14.     BitBuffer_CurrentBit = (BitBuffer_CurrentBit+1)&4095;
  15.     return Bit;
  16. }


 
Attention : Toutes les routines accédant à BitBuffer_CurrentBit appliquent d'office un ET de 4095 avant de s'en servir réellement.
 
Update> Attention, La routine hget1bit accède au bit spécifié par CurrentBit. Cette variable peut être considéré comme étant non-linéaire (aléatoire...).
 
La règle est la suivante :
Le code le plus rapide est gagnant et évidemment, on utilise de l'assembleur et tout est permis. Il est possible d'utiliser les extensions MMX/SSE... mais je préfère que chacun fournisse au moins un code x86 standard fonctionnant sur un Pentium normal.
 
Et qu'est ce qu'on gagne ?
Le meilleur code !
 
PS: J'espère ne pas avoir fait d'erreur.


Message édité par christophe_d13 le 24-07-2004 à 09:30:06
mood
Publicité
Posté le 19-07-2004 à 21:01:17  profilanswer
 

n°800000
Taz
bisounours-codeur
Posté le 19-07-2004 à 21:42:51  profilanswer
 

« appliquent d'office un ET de 4095 »
 
de l'algèbre modulaire en somme :o
 
ça fait bidon le & 4095 ...
 
 
et y en a marre du MMX/SSE, c'est un jeu d'instructions pourris et très pénalisant à l'utilisation par rapport à des vraies unités SIMD parallèles et indépendantess

n°800012
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2004 à 21:55:34  profilanswer
 

Taz a écrit :


et y en a marre du MMX/SSE, c'est un jeu d'instructions pourris et très pénalisant à l'utilisation par rapport à des vraies unités SIMD parallèles et indépendantess


le seul truc chiant pour le MMX, c'est que si tu l'utilises, tu peux pas utiliser la FPU en même temps :o
sinon ça booste les perfs sa mère avec le SSE !


---------------
J'ai un string dans l'array (Paris Hilton)
n°800192
christophe​_d13
L'efficacité à tout prix.
Posté le 20-07-2004 à 08:19:36  profilanswer
 

Taz a écrit :

ça fait bidon le & 4095 ...


Peut-être mais c'est pour vous permettre d'optimiser au max la routine.
La ligne "BitBuffer_CurrentBit = (BitBuffer_CurrentBit+1)&4095;"
Pourrait également être "BitBuffer_CurrentBit++;"
 

Taz a écrit :

et y en a marre du MMX/SSE, c'est un jeu d'instructions pourris et très pénalisant à l'utilisation par rapport à des vraies unités SIMD parallèles et indépendantess


Rien ne t'oblige à utiliser le MMX/SSE.
Pour ma part, je le fais en fonctions CPU standard.


Message édité par christophe_d13 le 20-07-2004 à 08:20:37
n°801158
Evadream -​jbd-
Posté le 20-07-2004 à 19:10:57  profilanswer
 

Je trouve pas d'idée :|

n°801191
Taz
bisounours-codeur
Posté le 20-07-2004 à 19:52:04  profilanswer
 

Harkonnen a écrit :

le seul truc chiant pour le MMX, c'est que si tu l'utilises, tu peux pas utiliser la FPU en même temps :o
sinon ça booste les perfs sa mère avec le SSE !

ben oui, mais j'ai beau demander des tests applicatifs pour qu'il se rende compte des dégats et de l'impact sur le cache, mais rien y fait. c'est sur que si tu fais que des memcpy c'est tout de suite plus rapide. Si tu travailles à côté, le MMX tu vas vite le ranger

n°801348
Joel F
Real men use unique_ptr
Posté le 20-07-2004 à 23:22:16  profilanswer
 

mais arretez le MMX c'est nul ....
SSE 2 *a la riguer*
 

n°801901
deltaden
Posté le 21-07-2004 à 15:07:44  profilanswer
 

D'ailleurs, si je ne me trompe pas, on ne saura plus faire de MMX (ni de x87 et de 3DNow) sur Windows x86-64. Il n'y aura plus que les entiers et le SSE(2).

n°802329
christophe​_d13
L'efficacité à tout prix.
Posté le 21-07-2004 à 19:36:45  profilanswer
 

Le MMX c'est nul... C'est pour ça qu'intel l'a sorti de son chapeau.
Vous oubliez que l'on ne possède pas systèmatiquement l'ordinateur de dernière génération.
 
Pour ma part, je reste sur ceci : Il faut avant toute chose mesurer les perfs avec plusieurs solutions pour prendre la meilleure.
Taz> Les perfs globale, pas uniquement dans un memcpy où l'on saccage le cache.

n°802337
Taz
bisounours-codeur
Posté le 21-07-2004 à 19:53:34  profilanswer
 

mais je ne demande que ça.

mood
Publicité
Posté le 21-07-2004 à 19:53:34  profilanswer
 

n°802758
christophe​_d13
L'efficacité à tout prix.
Posté le 22-07-2004 à 09:22:49  profilanswer
 

Personne pour ce petit bout de code ?
Cela se fait en 20 lignes max...

n°805169
christophe​_d13
L'efficacité à tout prix.
Posté le 24-07-2004 à 09:28:22  profilanswer
 

A la demande, j'ai rajouter des détails sur le post de départ.

n°805347
maze123coo​l
Posté le 24-07-2004 à 15:39:47  profilanswer
 

C'est faisable en moins de 10 instructions (sans instructions MMX & Co)   :)

n°805395
christophe​_d13
L'efficacité à tout prix.
Posté le 24-07-2004 à 18:01:33  profilanswer
 

Pour ma part, j'ai fait la routine en 10 instructions exactement, en comptant le RET. J'utilise également une LUT d'un QWORD.

n°805426
maze123coo​l
Posté le 24-07-2004 à 19:40:37  profilanswer
 

vi... un truc du genre:
 
unsigned char LookUp_Table[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
 

n°805432
christophe​_d13
L'efficacité à tout prix.
Posté le 24-07-2004 à 19:46:23  profilanswer
 

Idem pour moi.

n°805570
Taz
bisounours-codeur
Posté le 25-07-2004 à 01:35:21  profilanswer
 

en static const :o

n°810531
christophe​_d13
L'efficacité à tout prix.
Posté le 29-07-2004 à 22:23:19  profilanswer
 

Un concours qui ne passionne pas les foules...
 
Mais bon en ASM, c'est déjà plus sélectif.

n°811663
Champi Mon​ochrome
Posté le 30-07-2004 à 23:55:46  profilanswer
 

Je veux bien participer mais je pige pas le principe
Faut simplement écrire une procédure qui reçoit currentbit et qui renvoie bit ?

n°811765
BenO
Profil: Chercheur
Posté le 31-07-2004 à 10:51:23  profilanswer
 

taka montrer ta méthode et expliquer comment ca marche et un petit tutorial sur les instructions que tu utilises :D

n°813093
christophe​_d13
L'efficacité à tout prix.
Posté le 02-08-2004 à 23:31:44  profilanswer
 

Voici un exemple de code ASM pour GCC
 
 

Code :
  1. unsigned char hget1bit_mask[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
  2. unsigned long hgetbits ( unsigned long NbBits );
  3. asm ("
  4.                         .align 8
  5.     _hget1bit:
  6.                         movl _BitBuffer_CurrentBit,%edx   ;//U
  7.                         movl %edx, %eax                   ;//V
  8.                         shrl $3,%edx                      ;//U
  9.                         andl $7,%eax                      ;//V
  10.                         andl $4095,%edx                   ;//U
  11.                         movb _hget1bit_mask(%eax),%al     ;//V
  12.                         incl _BitBuffer_CurrentBit        ;//U mais 2 cycles car <incl m>
  13.                         andb _BitBuffer(%edx),%al         ;//V mais 2 cycles car <andl m,r>
  14.                         setnz %al                         ;//N
  15.                         ret                               ;//N 4 … 7 cycles
  16. " );

n°815442
Champi Mon​ochrome
Posté le 05-08-2004 à 01:45:23  profilanswer
 

J'ai relu trois fois ton code avant de me souvenir que ces cons d'at&t ils inversent les deux opérandes donc je me permets de le rappeller pour les débutants dans mon genre (j'espère que je suis pas le seul tiens)
 
Je ne comprends pas cette ligne

Code :
  1. andb _BitBuffer(%edx),%al         ;//V mais 2 cycles car <andl m,r>


Comment sais tu que Buffer[(CurrentBit>>3)&4095]=1 ?
 


Message édité par Champi Monochrome le 05-08-2004 à 02:00:24
n°815444
chrisbk
-
Posté le 05-08-2004 à 01:51:44  profilanswer
 

Code :
  1. movl _BitBuffer_CurrentBit,%edx   ;//U
  2. movl %edx, %eax                   ;//V


 
t'as pas l'impression de flinguer les dependances ?

n°816482
christophe​_d13
L'efficacité à tout prix.
Posté le 06-08-2004 à 10:27:19  profilanswer
 

chrisbk> C'est une dépendance WAR donc les processeurs P3, Amd K6 et 6x86 n'ont pas de problèmes (register renaming).
 
Champi Monochrome> setnz al

n°1248315
RebEl_THC
Posté le 18-11-2005 à 13:22:14  profilanswer
 

Voici une petite fonction delphi mais facilement reprenable dans tous les languages
 
function GetBit(IntegerValue: Integer;IntegerPosition: Integer):Integer;register;
    {
      Entrées  EAX (IntegerValue) EDX (IntegerPosition)
      Sorties  EAX
    }
    asm
{ 1C }mov ECX,EDX   // La fonction SHR a besoin du paramètre dans CL
{ 3C }shr EAX,CL      // On effectue le décalage
{ 1C }and EAX,$01   // On ne garde que le premier bit
    end;
 
Enfin, je n'ai pas compris ce 4095 ... c'est bien un seul bit que vous souhaitez ?
 
Bonne prog !

n°1248318
RebEl_THC
Posté le 18-11-2005 à 13:34:55  profilanswer
 

sinon j'ai ca ...
 
unsigned char BitBuffer[4096];  
unsigned long BitBuffer_CurrentBit;  
unsigned char Bin[256,8]
//-------------------------
//|n°oct | n°bit | valeur|
//-------------------------
//|0 | 0 | 0 |
//|... | ... | ... |
//|128 | 7 | 1 |
//.... etc
 
et on utilise :
Bin[BitBuffer[BitBuffer_CurrentBit],BitBuffer_CurrentBit & 7];
 
pour avoir le bit recherché
 
Bonne prog

n°1248326
RebEl_THC
Posté le 18-11-2005 à 13:40:17  profilanswer
 

oups, milles escuses ...
 
on utilise :  
Bin[BitBuffer[BitBuffer_CurrentBit>>3],BitBuffer_CurrentBit & 7];
 
Bonne prog !


---------------
Je suis et reste un éternel apprenti
n°1248374
RebEl_THC
Posté le 18-11-2005 à 14:12:17  profilanswer
 

Bon ce n'es pas de l'assembleur mais ... suivant le contexte utilisé, mieux vaut ne pas mettre ce code dans une fonction mais plutot directement lors du traitement
 
style
 
unsigned char BitBuffer[4096];  
unsigned long BitBuffer_CurrentBit;
unsigned integer Bin[256,8] // mieux vaut finalement les avoir direct en integer 32 bit
 
int main (int argc,char*argv)
 
// Le code de traitement ...
unsigned int posByte;
unsigned int posbit;
 
// dans la boucle ...
asm {
  // ici mieux vaut déjà s'etre arrangé pour avoir BitBuffer_CurrentBit dans eax
  mov eax,BitBuffer_CurrentBit // 1cycle comme ca on zappe cette instruction
  mov ebx,eax  // 1 cycle
  shr eax,3  // a peu près 3 cycle
  and ebx,7 // 1 cycle
  // je ne sais pas si ca marche (pas testé)
  mov ecx, dword ptr [BitBuffer + EAX] // 1 cycle
  // si resultat attendu dans eax
  // syntaxe peut être incorrecte suivant les compilos
  // Manque de connaissance dans la variété des compilo pour vous aiguiller
  // essayer typeof
  // sizeof etc ...
  mov eax,dword ptr [Bin + EBX * Type int] // 1 cycle
 
  // soit 7-8 cycle par bit (7 dans le cas ou eax est déjà )
}
// fin de la boucle
 
equivaudrait à :
 
Bin[BitBuffer[BitBuffer_CurrentBit>>3],BitBuffer_CurrentBit & 7];
 
 


---------------
Je suis et reste un éternel apprenti
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [Concours n°4] A la recherche du bit perdu...

 

Sujets relatifs
petit concours de securitéRecherche dans du texte
MYSQL - Recherche d'un "SELECT" hasardeux non "équiprobable" !Recherche dans une base sql ?
Perdu ds la base de données...Recherche composant style listbox avec chackbox incorporé
[resolu] moteur de recherche phpProblème avec l'affichage d'une recherche
Page d'attente pour moteur de recherche [résolu]Recherche dll pour traitement d'images (modification de dpi)
Plus de sujets relatifs à : [Concours n°4] A la recherche du bit perdu...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR