12
votes

La ligne de cache sera-t-elle alignée sur une allocation de mémoire?

Je sais juste des idées de base sur l'allocation de mémoire alignée. Mais je n'ai pas grandi beaucoup sur Aligner la question parce que je ne suis pas un programmeur de montage, n'avait pas non plus de expérience avec MMX / SIMD. Et je pense que c'est l'une des optimisations prématurées.

De nos jours, les gens disent de plus en plus sur le cache Hit, le cache cohérent, l'optimisation de la taille, etc. Certains code source attribuent même la mémoire explicitement alignée sur les lignes de cache de la CPU.

Franchement, je ne sais pas combien coûte la taille de la ligne de cache de ma CPU I7. Je sais qu'il n'y aura pas de mal à aligner de grande taille. Mais va-t-il vraiment payer, sans simd?

Disons-y 100 000 articles de 100 octets dans un programme. Et l'accès à ces données est le travail le plus intensif du programme.

Si nous modifions la structure de données et que toutes les données de taille des 100 octets sont alignées sur 16 octets, est-il possible de gagner un gain de performance notable? dix%? 5%?


3 commentaires

En parlant d'optimisation prématurée, saviez-vous que de bons algorithmes peuvent souvent donner des centaines ou des milliers d'augmentations de vitesse pour des séries de données plus importantes (et encore plus encore plus grandes)? ;) Détails Comme dans quelle mesure le programme joue avec le cache figure sur la liste pour l'informatique hautes performances, mais pour la plupart des applications, cela ne comptera jamais.


Je crois que 64 octets est une taille de ligne de cache courante, pas 16 octets.


J'ai eu une amélioration de dix fois à partir d'un algorithme une fois par cache-alignement et préignant ses accès à la mémoire.


4 Réponses :


4
votes

Cela dépend de votre système. Essayez-le, courez quelques points de repère et découvrez.


6 commentaires

Ensuite, c'est l'optimisation prématurée. Et comment on peut le faire sans fonction de détection de processeur fiable et la liste des informations de cache CPU? Hmm .. Suis-je trop t'inquiéter pour rien?


Toute optimisation est prématurée jusqu'à ce que vous ayez réellement testé ce qui est lent.


@ 9dan - Vous n'avez pas besoin de ces choses, juste une horloge.


@ORANGEDOG Je veux dire, car le résultat de référence variera par la CPU, je ne peux pas appliquer l'optimisation du cache sans fonction de détection de la CPU.


@ 9dan - c'est ce que font des fabricants et #Ifdef. Cependant, ces optimisations sont peu susceptibles de réduire considérablement les performances: elles l'amélioreront ou il y aura peu d'effet.


@ 9Dan inquiétant de faux partage à l'avance n'est pas prématuré si vous avez besoin de multiples noyaux pour traiter le traitement. Si vous avez un partage inattendu, votre performance sera pire que d'utiliser un seul processeur. Jusqu'à présent, tout système où plusieurs cœurs doivent travailler sur les mêmes données, je dirais que la conception de données appropriée n'est pas une optimisation, mais une exigence.



7
votes

C'est l'un de mes blogs récents préférés sur les effets de cache. http://igoro.com/archive/gallery-of-processor-cache- Effets /


1 commentaires

Meilleure explication sur le cache de processeur que j'ai jamais lu. Ce sont des effets vraiment dramatiques du cache. J'ai peur si j'étais trop naïf ..



4
votes

La plupart des discussions sur l'alignement de la ligne de cache Traitement avec l'informatique hautes performances travaillant avec de nombreux threads et maintien de l'évolutivité aussi près que possible de linéaire possible. Dans ces discussions, la raison de l'alignement de la ligne de cache est d'empêcher une variable d'écriture à une variable de données invalidant la ligne de cache contenant également une autre variable utilisée par un fil différent.

Donc, à moins que vous n'essayez d'écrire du code qui évoluera un très grand nombre de cœurs de processeur, l'alignement de la ligne de cache ne vous importera probablement pas beaucoup pour vous. Mais encore une fois, testez-le et voyez.


5 commentaires

Je pense que toutes les réponses ont donné ses propres cours, mais cette réponse peut être la règle de base (mais un vote minimum), alors j'ai accepté cela. Merci.


Deux threads suffisent pour un faux partage montrant sa tête cruelle. (Mais avec la taille de données de 100 octets, je doute que le faux partage soit un problème pour eux).


@Aprogrammer Bon point sur l'écriture. Je ne suis inquiété que de lire.


Oui, le faux partage peut détruire un programme. L'alignement peut également être utilisé pour optimiser le partage. Ces variables qui seront toujours sales et nécessaires par de nombreux threads peuvent tous être emballées dans une seule ligne de cache. Cela signifie qu'une seule cache-ligne doit être mise à jour.


Je ne suis pas d'accord, même pour une application à une seule-filetée avec beaucoup d'alignement d'accès à la mémoire pourraient faire une différence significative de la performance.



5
votes

Optimisation du cache Payez même pour la demande de Monothread. Mais l'optimisation du cache n'allage pas nécessairement des données au début du cache, car plusieurs facteurs tiennent compte des considérations. Donc la voie à suivre est:

  • répondez-vous à votre exigence de performance? Si oui, pourquoi passer du temps à optimiser. Optimiser pour l'optimisation de la paie rarement.

  • mesure où votre goulot d'étranglement est. Si vous soupçonnez des problèmes de cache, utilisez un outil qui signale le cache Miss et donc d'avoir une idée de combien vous pourriez gagner.

    Au niveau de la Higest, l'objectif de l'optimisation du cache est de remplir votre cache avec des données intéressantes tout en conservant des données non intéressantes. Si vous faites une programmation multithread, la prévention des interférences entre le thread est également importante. Ensuite, vous devez également empêcher certaines choses qui sont spécifiques à une implémentation de cache, telles que les effets de résonance qui réduisent parfois la taille du cache d'effets pour cache non entièrement associative.


2 commentaires

Donc, apparemment à lire, probablement pour l'écriture, l'allocation de mémoire alignée sur la ligne de cache n'est pas une question importante, n'est-ce pas?


Si vos données sont en lecture seule, ce qui est important, c'est que les données accessibles ensemble restent dans le cache autant que possible. La taille de la ligne de I7 est de 64 octets (voir agner.org/optimize/microarchitecture.pdfle/a >) Donc, une de vos données correctement alignées couvrira 2 lignes de cache, tandis que s'il ne prendra pas 3 lignes de cache. Cela pourrait donc aider (ai-je écrit que la mesure était la voie à suivre lorsque vous souhaitez optimiser?)