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

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

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

Message 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.
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

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

Message 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.
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

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

Message 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
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

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

Message 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 ?
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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 ;)
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

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

Message 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.
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

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

Message 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 :)
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

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

Message 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:
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message par djes »

Moi je l'avais embêté avec les alignements aussi, mais pour l'optim du code... :mrgreen:
Répondre