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

  FORUM HardWare.fr
  Programmation
  C

  allocation mémoire optimisée au niveau bit

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

allocation mémoire optimisée au niveau bit

n°1881627
albertofra​ncko
Posté le 06-05-2009 à 21:41:35  profilanswer
 

Bonjour,
J'aimerais savoir si vous savez si il existe une fonction d'allocation qui soit optimisée au niveau des bits. Je m'explique : habituellement, quand je déclare int i = 5 par exemple, je n'utilise que 3 bits sur les 32 (ou 64 ). Existe t'il une fonction d'allocation qui me permettrai de récuperer les 29 bits restant pour d'autres allocations ? Ayant déja beaucoup cherché sans succes je pense ecrire cette fonction moi meme, mais cela me semble assez compliqué , car il me faudrait utiliser des masques pour récuperer les differentes valeur stockées dans un mot mémoire. Qu'en pensez vous ?
Merci

mood
Publicité
Posté le 06-05-2009 à 21:41:35  profilanswer
 

n°1881631
Taz
bisounours-codeur
Posté le 06-05-2009 à 21:56:14  profilanswer
 

Pour 40€ tu peux avoir 2G de RAM. Je suis près à t'envoyer immédiatement un chèque de 1 centime pour compenser la perte de tous ces bits. (Je te laisse faire le calcul sur combien de bits pour peut acheter avec 1 centime).

n°1881632
albertofra​ncko
Posté le 06-05-2009 à 22:02:30  profilanswer
 

C'est pour une tres grosse application et le gain de ces bits ne serait pas negligeable

n°1881639
masklinn
í dag viðrar vel til loftárása
Posté le 06-05-2009 à 22:21:35  profilanswer
 

Si t'as envie de perdre ton temps, tu peux utiliser char qui a une taille minimale de 8 bits (et non 32). Si t'as encore plus envie de perdre ton temps, tu peux t'amuser à faire du bit packing à coup de masques et de shifts. Dans tous les cas, je doute fort que tu puisses avoir des int bruts non alignés.
 
Et il est très peu probable que tes pressions mémoire soient sur du stockage d'entiers...


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1881643
Elmoricq
Modérateur
Posté le 06-05-2009 à 22:47:54  profilanswer
 

albertofrancko a écrit :

C'est pour une tres grosse application et le gain de ces bits ne serait pas negligeable


 
J'aimerais bien voir ton argumentation. On a le même "problème" (appli 32 bits qui sur certains traitements dépasse allègrement les 4Go fatidiques), et le temps de développement et de tests de ce que tu veux faire, pour un gain qui reste à démontrer, me semblent représenter un coût bien supérieur (et de loin) à une stratégie de découpage en lots (grid computing par exemple).

n°1881653
albertofra​ncko
Posté le 06-05-2009 à 23:11:26  profilanswer
 

C'est pour un simulateur de reseau de neurones distribué. Le but est de faire tourner un maximum de neurones sur chaque machine.
Donc selon vous c'est quelque chose de difficilement réalisable et inutile ? Ou alors y en a t'il qui pensent que c'est faisable ? La solution que je vois consisterais stocker un numero de masque ( de 1 a 36 pour un octet par exemple ) a utiliser pour chaque allocation, mais ca me semble un peu lourd. Avez-vous des idées a me proposer ?
Merci de vos avis

n°1881654
masklinn
í dag viðrar vel til loftárása
Posté le 06-05-2009 à 23:21:31  profilanswer
 

albertofrancko a écrit :

Avez-vous des idées a me proposer ?


Bien sûr: ne pas faire un truc pareil.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1881656
Elmoricq
Modérateur
Posté le 06-05-2009 à 23:24:46  profilanswer
 

Je pense qu'en premier lieu, un audit mémoire serait plus profitable. S'il n'y en a jamais eu et que le code est conséquent, alors je suis prêt à parier qu'il y a des fuites mémoires, ou des libérations jamais effectuées, ou des algorithmes inutilement gourmands. Les corriger peut grandement améliorer les choses à moindre frais (en plus de stabiliser le produit).

 

Ensuite, si tu es déjà en distribué et que vous avez déjà tiré sur la corde, alors il ne reste que le découpage en taches plus petites pour les lots les plus lourds. En plus avec un bon ordonnanceur de tâches, c'est une stratégie plus payante, en tout cas ça l'a été chez nous (on fait du calcul distribué).

 

Mais dans tous les cas, à moins d'une étude sérieuse (et que forcément vous ètes les seuls à pouvoir faire sur le produit) des gains sur ce que tu proposes est à effectuer avant de se lancer dans la bataille. Mais honnêtement, je partage l'avis de taz et de masklinn : le gain reste largement à démontrer.


Message édité par Elmoricq le 06-05-2009 à 23:27:54
n°1881719
theshockwa​ve
I work at a firm named Koslow
Posté le 07-05-2009 à 10:03:55  profilanswer
 

et tu ne peux pas utiliser des bitfields aux endroits où tu gaspillerais beaucoup de mémoire de cette manière, plutôt que faire un allocateur ?
 
edit : typo


Message édité par theshockwave le 07-05-2009 à 10:04:12

---------------
last.fm
n°1881730
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-05-2009 à 10:21:43  profilanswer
 

albertofrancko a écrit :

J'aimerais savoir si vous savez si il existe une fonction d'allocation qui soit optimisée au niveau des bits.

Non. La résolution est le char qui fait 8 bit au minimum (parfois plus sur certaines architectures comme les DSP).

Citation :


 Je m'explique : habituellement, quand je déclare int i = 5 par exemple, je n'utilise que 3 bits sur les 32 (ou 64 ). Existe t'il une fonction d'allocation qui me permettrai de récuperer les 29 bits restant pour d'autres allocations ? Ayant déja beaucoup cherché sans succes je pense ecrire cette fonction moi meme, mais cela me semble assez compliqué , car il me faudrait utiliser des masques pour récuperer les differentes valeur stockées dans un mot mémoire.


Si c'est pour une variable toute seule, ça n'a bien sur aucun intérêt. Le problème se pose quand on a plusieurs variables (une structure, par exemple) et qu'on cherche à réduire l'empreinte mémoire d'un tableau de structure.

 

Par exemple :

Code :
  1. #include <stdio.h>
  2. struct date
  3. {
  4.    int year;
  5.    int month;
  6.    int day;
  7.    int hour;
  8.    int minute;
  9.    int second;
  10. };
  11. int main (void)
  12. {
  13.    struct date tab[10];
  14.    printf ("sizeof tab = %lu\n", (unsigned long) sizeof tab);
  15.    return 0;
  16. }


donne


sizeof tab = 240

 

Process returned 0 (0x0)   execution time : 0.052 s
Press any key to continue.


Dans ce cas particulier, on peut analyser quelle sont les plages de valeurs requises pour chaque champ et optimiser la mémoire en utilisant des champs de bits dont la largeur est optimisée à l'usage qui en est fait, ce qui donne :

 

http://www.bien-programmer.fr/notes.htm#bitfield

Code :
  1. #include <stdio.h>
  2. struct date
  3. {
  4.    unsigned year:12;              /* 0-4095 */
  5.    unsigned month:4;              /* 1-12 */
  6.    unsigned day:5;                /* 1-31 */
  7.    unsigned hour:5;               /* 0-23 */
  8.    unsigned minute:6;             /* 0-59 */
  9.    unsigned second:6;             /* 0-59 */
  10. };
  11. int main (void)
  12. {
  13.    struct date tab[10] = { {4095, 12, 31, 23, 59, 59} };
  14.    printf ("sizeof tab = %lu\n", (unsigned long) sizeof tab);
  15.    printf ("%4u/%02u/%02u %02u:%02u:%02u\n", tab[0].year, tab[0].month,
  16.            tab[0].day, tab[0].hour, tab[0].minute, tab[0].second);
  17.    return 0;
  18. }



sizeof tab = 80
4095/12/31 23:59:59

 

Process returned 0 (0x0)   execution time : 0.033 s
Press any key to continue.


On voit que la taille de la structure est passée de 24 à 8 char ...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 07-05-2009 à 10:37:25

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 07-05-2009 à 10:21:43  profilanswer
 

n°1881986
albertofra​ncko
Posté le 07-05-2009 à 19:31:09  profilanswer
 

Merci de vos avis. Je pense que je vais réfléchir encore un peu avant de me lancer, bien sur je comprend que ce soit a faire en dernier lieu, mais je vais quand meme le faire au moins pour voir le résultat.

n°1885885
gilou
Modérateur
Modzilla
Posté le 18-05-2009 à 23:33:41  profilanswer
 

Emmanuel Delahaye a écrit :

Dans ce cas particulier, on peut analyser quelle sont les plages de valeurs requises pour chaque champ et optimiser la mémoire en utilisant des champs de bits dont la largeur est optimisée à l'usage qui en est fait

Mais comme rien n'est gratuit, ce qu'on gagne en place, on va le perdre en efficacité d'accès aux valeurs, dès qu'on y accède pas en bloc, non?
A+,

Message cité 1 fois
Message édité par gilou le 18-05-2009 à 23:39:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1885896
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-05-2009 à 01:24:10  profilanswer
 

gilou a écrit :

Mais comme rien n'est gratuit, ce qu'on gagne en place, on va le perdre en efficacité d'accès aux valeurs, dès qu'on y accède pas en bloc, non?
A+,


Oui. Il faut choisir entre optimisation en taille et en vitesse. C'est pas un scoop !


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1885962
gilou
Modérateur
Modzilla
Posté le 19-05-2009 à 09:58:11  profilanswer
 

C'est juste que tes tests donnaient l'impression (execution time) qu'on y gagnait aussi en temps d'execution, ce qui ne doit être le cas que de certains usages, et que je n'aurais pas voulu que l'auteur du topic le pense. Ici, c'est peut être l'allocation plus importante qui consomme un peu plus de temps dans le premier cas.
A+,

Message cité 1 fois
Message édité par gilou le 19-05-2009 à 10:00:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1885967
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-05-2009 à 10:04:45  profilanswer
 

gilou a écrit :

C'est juste que tes tests donnaient l'impression (execution time)


Ca, c'est juste une indication que donne systématiquement mon environnement de développement (Code::Blocks). J'ai juste fait un copié/collé de la sortie...
 
D'ailleurs, ma remarque portait sur la taille et non sur le temps...

Citation :

On voit que la taille de la structure est passée de 24 à 8 char ...


Message édité par Emmanuel Delahaye le 19-05-2009 à 10:06:24

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

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

  allocation mémoire optimisée au niveau bit

 

Sujets relatifs
mysql et c++ sous codeblocks erreur o niveau de insertLa mémoire ne peut pas être "read"
Mise à niveau VB5Ajout d'une mémoire externe EEPROM 24LC256 (bus i2c) à un PIC 18F452
Gestion de la mémoire sous Vistalangage le plus demandé au niveau mondial?
Niveau / selecteur en CSSBug Mémoire - ocx
Allocation très grande taille mémoire 
Plus de sujets relatifs à : allocation mémoire optimisée au niveau bit


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