J'ai récemment rencontré ce que je pense être un faux problème de partage dans mon application, et j'ai recherché Sutter's article sur la façon d'aligner mes données sur les lignes de cache. Il suggère le code C++ suivant:Alignement de la ligne de cache (Besoin de clarification sur l'article)
// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] T data;
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
Je peux voir comment cela fonctionnerait quand CACHE_LINE_SIZE > sizeof(T)
est vrai - la struct cache_line_storage
termine juste en prenant une ligne complète de cache de la mémoire. Cependant, lorsque le sizeof(T)
est plus grand qu'une seule ligne de cache, je pense que nous devrions tamponner les données par CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
octets, de sorte que la structure résultante ait une taille qui soit un multiple entier de la taille de la ligne de cache. Quel est le problème avec ma compréhension? Pourquoi le remplissage avec 1 octet suffit-il?
+1, bien que, en pratique, je ne connaisse aucun cas où un alignement struct peut être supérieur à la taille de la cacheline. Après tout, les contraintes d'alignement de type proviennent généralement des contraintes de la ligne de commande. – Bahbar
L'alignement est-il appliqué à la structure ou au premier élément de la structure dans votre suggestion? –
Mais quant à la mécanique du faux-partage lui-même ... pour l'empêcher, ne devrait-on pas aligner T sur un multiple entier de la taille de la ligne de cache, même si 'sizeof (T)> CACHE_LINE_SIZE'? Ou n'est-ce pas nécessaire? – int3