61 votes

Programmation sensible au cache C ++

Existe-t-il un moyen en C ++ de déterminer la taille du cache du processeur? J'ai un algorithme qui traite beaucoup de données et j'aimerais les décomposer en morceaux de manière à ce qu'ils tiennent dans le cache. Est-ce possible? Pouvez-vous me donner d'autres indications sur la programmation en tenant compte de la taille du cache (notamment en ce qui concerne le traitement de données multithreads / multicœurs)?

Merci!

32voto

Andreas Brinck Points 23806

Ceci est une copie de ma réponse à une autre question, mais voici:

Voici un lien vers un très bon article sur l'optimisation de la mémoire cache / mémoire de Christer Ericsson (de la gloire de God of War I / II / III).

Il a quelques années mais reste très pertinent.

16voto

Robert S. Barnes Points 17244

Selon "Ce que chaque programmeur doit savoir à propos de la mémoire", par Ulrich Drepper, vous pouvez effectuer les opérations suivantes sur Linux:

Une fois que nous avons une formule pour la mémoire exigences, nous pouvons la comparer avec la taille de la mémoire cache. Comme mentionné avant, le le cache peut être partagée avec plusieurs d'autres noyaux. Actuellement, {Il certainement va très bientôt être un meilleure façon!} la seule façon d'obtenir informations correctes sans coder en dur la connaissance est par le biais de l' /sys système de fichiers. Dans le Tableau 5.2, nous avons vu la ce que le noyau publie environ le matériel. Un programme a trouver le répertoire:

/sys/devices/system/cpu/cpu*/cache

Ceci est indiqué dans la Section 6: Ce que les Programmeurs Peuvent Faire.

Il a également décrit un essai de droit en vertu de la Figure 6.5, qui peut être utilisé pour déterminer L1D taille du cache si vous ne pouvez pas obtenir à partir de l'OS.

Il y a une chose que j'ai couru à travers, dans son livre: sysconf(_SC_LEVEL2_CACHE_SIZE) est un appel système sur Linux qui est censé renvoyer le cache L2 de la taille, bien qu'il ne semble pas à être bien documentée.

11voto

kusma Points 3719

Le C ++ lui-même ne se soucie pas des caches de processeur, il n'est donc pas possible de demander des tailles de cache intégrées dans le langage. Si vous développez pour Windows, vous disposez de la fonction GetLogicalProcessorInformation () , qui peut être utilisée pour interroger des informations sur les caches de processeur.

8voto

ben Points 61

Préallouez un grand tableau. Accédez ensuite à chaque élément de manière séquentielle et enregistrez l'heure pour chaque accès. Idéalement, il y aura un saut dans le temps d'accès lorsque la mémoire cache est manquante. Ensuite, vous pouvez calculer votre cache L1. Cela pourrait ne pas fonctionner, mais ça vaut la peine d'essayer.

4voto

Tobias Langner Points 6354

lisez le cpuid du cpu (x86), puis déterminez la taille du cache à l'aide d'une table de correspondance. Le tableau doit être rempli avec les tailles de cache que le fabricant du processeur publie dans ses manuels de programmation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X