allocation mémoire optimisée au niveau bit

allocation mémoire optimisée au niveau bit - C - Programmation

Marsh Posté le 06-05-2009 à 21:41:35    

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

Reply

Marsh Posté le 06-05-2009 à 21:41:35   

Reply

Marsh Posté le 06-05-2009 à 21:56:14    

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).

Reply

Marsh Posté le 06-05-2009 à 22:02:30    

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

Reply

Marsh Posté le 06-05-2009 à 22:21:35    

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
Reply

Marsh Posté le 06-05-2009 à 22:47:54    

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).

Reply

Marsh Posté le 06-05-2009 à 23:11:26    

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

Reply

Marsh Posté le 06-05-2009 à 23:21:31    

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
Reply

Marsh Posté le 06-05-2009 à 23:24:46    

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
Reply

Marsh Posté le 07-05-2009 à 10:03:55    

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
Reply

Marsh Posté le 07-05-2009 à 10:21:43    

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/
Reply

Marsh Posté le 07-05-2009 à 10:21:43   

Reply

Marsh Posté le 07-05-2009 à 19:31:09    

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.

Reply

Marsh Posté le 18-05-2009 à 23:33:41    

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é!  --
Reply

Marsh Posté le 19-05-2009 à 01:24:10    

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/
Reply

Marsh Posté le 19-05-2009 à 09:58:11    

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é!  --
Reply

Marsh Posté le 19-05-2009 à 10:04:45    

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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed