Page 1 sur 1

Alignement Mémoire ? (Map,List..)

Publié : mar. 18/sept./2012 14:22
par grabiller
Bonjour,

J'ai essayé de trouver l'info sur le forum mais sans grand succès, peut-être que vous pouvez m'aider.

Je voudrai savoir comment (et dans quelle mesure) le compilateur PureBasic aligne les allocations mémoires, les structures etc.. ?

Notamment, quand une Map, une List, etc.. ajoute des items elle se charge elle-même des allocations mémoire pour ses items mais comment savoir sur quelle base sont alignées ces allocation ? Y-a-t-il moyen d'agir sur ces alignements ?

Et ce, en x32 et x64, sur Windows, Linux, MacOSX ?

Merci d'avance pour votre aide.

Cordialement,
Guy.

Re: Alignement Mémoire ? (Map,List..)

Publié : mar. 18/sept./2012 15:04
par djes
J'ai lu qq part que pour la version mac au moins, les structures seraient désormais alignées sur 64 bits. Fred, si tu passes par là...

Si tu veux bidouiller, tu peux t'occuper toi-même des allocations avec un pointeur, ou utiliser pour le code et les data la directive fasm "section code machin align 64". Mais bon, ça n'est pas très portable ni pérenne.

Re: Alignement Mémoire ? (Map,List..)

Publié : mar. 18/sept./2012 20:41
par grabiller
Ouch, 64 bits cela me parait énorme, non ?

Il me semble que Mac OSX 'exige' des alignements sur 16 bit, mais à par ça je ne sais pas grand chose de plus.

C'est étonnant qu'on ne trouve l'info nul part, c'est important pourtant les alignements, c'est assez vital je pense de savoir comment PB aligne ses structures et ses allocations mémoire, surtout pour les Map, List et de savoir si on peut intervenir sur ces alignements.

Lors d'une allocation mémoire 'normal' on peut gérer ça nous même, mais quand c'est PB qui alloue en interne j'aimerai bien connaître la réponse histoire d'être sûr des alignements.

Re: Alignement Mémoire ? (Map,List..)

Publié : mar. 18/sept./2012 22:53
par Fred
Je vois pas trop en quoi c'est 'important'. Tu peux préciser pourquoi tu as besoin de cette info ?

PB utilise son propre pool, pour les listes et les maps, aucun alignement n'est garanti: http://www.purebasic.fr/blog/?p=8

Re: Alignement Mémoire ? (Map,List..)

Publié : mar. 18/sept./2012 23:12
par grabiller
Et bien pardonnes-moi, mais si tu ne vois pas "l'importance" de l'alignement c'est un peu inquiétant.

Comme je travail en rapport avec Blender en ce moment je me permets de te renvoyer sur cette page:
http://wiki.blender.org/index.php/Dev:S ... SDNA_Notes

Je peux 'forcer' un AllocateMemory à s'aligner en créant un wrapper, mais pour les List et Map apparemment on ne peut pas.

Donc, si j'ai bien compris, si je crée une structure dont les membres sont correctement alignés (insertion de pad..) je n'ai, par contre, aucune garantie qu'un item du type de cette structure soit correctement aligné sur 8 ou 16 bits dans une List ou une Map ?

Re: Alignement Mémoire ? (Map,List..)

Publié : mer. 19/sept./2012 11:00
par djes
grabiller a écrit :Ouch, 64 bits cela me parait énorme, non ?
Ben non... En fait, tous les processeurs doivent s'accommoder de la largeur des bus pour accéder de façon optimale à la mémoire, c'est comme ça depuis les premiers processeurs 16 bits sur des bus supérieurs à 8 bits :)
Du coup, quand un proc veut accéder à une donnée en mémoire, même si celle-ci fait 8 bits, il prend au moins un paquet de la taille du bus. Si la donnée n'est pas alignée, il y a forcément une perte de performance...

Voir là pour les tailles de bus (http://www.cpu-world.com/CPUs/CPU.html) (ça va rappeler des souvenirs aux anciens)

Avec les caches, il regarde d'abord dans le (les) caches si la donnée n'y est pas, et ensuite il charge un gros paquet en fonction de "prédictions" de futurs accès et autres trucs imaginés par les constructeurs. Il lui arrive de charger "en rafale" plusieurs Ko pour un simple accès mémoire d'un octet, c'est ce qu'on appelle un cache-hit, et ça fait mal aux perfs !

Donc, il est important d'aligner ses données sur des multiples de la largeur du bus, et éventuellement des paquets chargés en rafale. Pour un processeur 64 bits, l'alignement sur 64 bits est évident, mais nos procs font aussi du 128/256 bits pour les nombres flottants, et font des rafales de plusieurs fois la largeur du bus pour recharger les caches, donc c'est bien d'aligner sur des paquets de 256 bits par exemple.

L'inconvénient de tout ça est qu'on perd de la mémoire si on veut de bonnes perfs : si la structure n'est pas de la bonne taille, les données les uns à la suite des autres ne seront pas systématiquement bien alignées ; si on veut de bonnes perfs, on va ajouter un pad (octets réservés pour l'alignement et qui ne servent à rien).

PB utilise l'OS pour allouer la mémoire ; l'OS aligne les allocations en fonction du processeur et des bus, mais pb n'aligne pas 'après' les données dans le tas. Donc pour de meilleures perfs il vaut mieux allouer de gros paquets et s'occuper soi-même de l'alignement avec des pads judicieusement placés, ou faire de nombreux essais avec PB.

Bon, encore un cours (pour les nuls comme moi) gracieusement offert par djes ;)

Re: Alignement Mémoire ? (Map,List..)

Publié : mer. 19/sept./2012 11:34
par grabiller
djes a écrit : ../.. Donc pour de meilleures perfs il vaut mieux allouer de gros paquets et s'occuper soi-même de l'alignement avec des pads judicieusement placés, ou faire de nombreux essais avec PB ../..
Oui mais justement, dans le cas des List ou Map on a pas ce genre de latitude. On ne peut pas leur dire (à moins d'avoir loupé un truc) : "alloues moi de la place pour 1000 items, en mémoire contiguë, et alignes le premier sur 8, 16, 64 bits, etc.. Ou encore leur dire d'allouer chaque item à une place mémoire alignée sur xx bits.

Re: Alignement Mémoire ? (Map,List..)

Publié : mer. 19/sept./2012 12:47
par djes
grabiller a écrit :
djes a écrit : ../.. Donc pour de meilleures perfs il vaut mieux allouer de gros paquets et s'occuper soi-même de l'alignement avec des pads judicieusement placés, ou faire de nombreux essais avec PB ../..
Oui mais justement, dans le cas des List ou Map on a pas ce genre de latitude. On ne peut pas leur dire (à moins d'avoir loupé un truc) : "alloues moi de la place pour 1000 items, en mémoire contiguë, et alignes le premier sur 8, 16, 64 bits, etc.. Ou encore leur dire d'allouer chaque item à une place mémoire alignée sur xx bits.
Oui, oui, j'avais compris, et Fred aussi j'en suis sûr ^^ Son article de blog est là-dessus, il explique que tout va bien tant qu'on ne libère pas d'éléments, parce que là, évidemment, ça fait des trous ! Si j'ai bien compris, il a implémenté le système décrit dans le papier http://citeseerx.ist.psu.edu/viewdoc/su ... .1.29.4759 depuis un bon moment déjà, de façon à gagner en performances et en capacités d'allocation dynamique de mémoire. Je pense que l'alignement suit, si l'utilisateur prévoit le padding lui-même en calculant la taille de ses structures.

Re: Alignement Mémoire ? (Map,List..)

Publié : mer. 19/sept./2012 19:52
par Fred
grabiller a écrit :Et bien pardonnes-moi, mais si tu ne vois pas "l'importance" de l'alignement c'est un peu inquiétant.
Heu, c'est sur je comprends rien à tout ca c'est au dessus de mes capacités ;).

Comme je travail en rapport avec Blender en ce moment je me permets de te renvoyer sur cette page:
http://wiki.blender.org/index.php/Dev:S ... SDNA_Notes

Je peux 'forcer' un AllocateMemory à s'aligner en créant un wrapper, mais pour les List et Map apparemment on ne peut pas.

Donc, si j'ai bien compris, si je crée une structure dont les membres sont correctement alignés (insertion de pad..) je n'ai, par contre, aucune garantie qu'un item du type de cette structure soit correctement aligné sur 8 ou 16 bits dans une List ou une Map ?
Plus sérieusement, les listes/map utilise leur propre pool, et du coup l'alignement n'est jamais garanti. Tu peux toujours definir une structure un peu plus grande et aligner le resultat de AddElement() puis utiliser un pointeur pour acceder à tes données. Rien n'est impossible, mais c'est vrai qu'en PureBasic, ce genre de preoccupations ne sont pas vraiment prioritaires (si tu veux vraiment un code le plus rapide possible, y'a pas de secret, utilise VC++ ou Intel C++). D'ailleurs t'es le premier depuis 12 ans à soulever la question à propos de l'alignement map et des listes :)

Re: Alignement Mémoire ? (Map,List..)

Publié : mer. 19/sept./2012 20:11
par grabiller
Fred a écrit :../.. Heu, c'est sur je comprends rien à tout ca c'est au dessus de mes capacités ;).../..
Et bien je réagissais juste à ta remarque:
"Je vois pas trop en quoi c'est 'important'../.."
Quand on tend un bâton pour se faire frapper - d'autant que je fais du Kendo - faut pas venir se plaindre après ;-)
Ça reste de l'humour, évidemment.
Fred a écrit :../..Tu peux toujours definir une structure un peu plus grande et aligner le resultat de AddElement() puis utiliser un pointeur pour acceder à tes données../..
Et bien en voilà une bonne idée, oui, je n'y avais pas pensé. Merci.
Fred a écrit :../.. Rien n'est impossible, mais c'est vrai qu'en PureBasic, ce genre de preoccupations ne sont pas vraiment prioritaires (si tu veux vraiment un code le plus rapide possible, y'a pas de secret, utilise VC++ ou Intel C++)../..
Je sais bien, mais pour prototyper certaines choses je n'ai pas envie de perdre du temps avec de la compilation C/C++ sur Windows,Linux & Mac OSX à la fois. Cela n'empêche pas d'optimiser le code PureBasic non plus.
Fred a écrit :../..D'ailleurs t'es le premier depuis 12 ans à soulever la question à propos de l'alignement map et des listes :)
Et bien au moins y a un curieux et ça vérifie l'adage: il y a un début à tout. :wink:

Re: Alignement Mémoire ? (Map,List..)

Publié : mer. 19/sept./2012 21:05
par djes
Moi je l'avais embêté avec les alignements aussi, mais pour l'optim du code... :mrgreen: