Puisque vous mentionnez spécifiquement plusieurs threads, je suppose que vous avez au moins un système multi-socket. Généralement, les banques de mémoire sont associées aux sockets de processeur. C'est-à-dire qu'un processeur est "le plus proche" de ses propres banques de mémoire et doit communiquer avec les autres contrôleurs memopry des processeurs pour accéder aux données des autres banques. (Processeur signifie ici la chose physique dans le socket)
Lorsque vous allouez des données, une politique de première écriture est généralement utilisée pour déterminer sur quelles banques de mémoire vos données seront allouées, ce qui signifie qu'elles peuvent y accéder plus rapidement que les autres processeurs. Donc, au moins pour les processeurs multiples (pas seulement les multiples cœurs), il devrait y avoir une amélioration des performances à partir de l'allocation d'une copie au moins pour chaque processeur. Assurez-vous d'allouer/copier les données avec chaque processeur/thread et non avec un thread principal (pour exploiter la politique de première écriture). Vous devez également vous assurer que les threads ne migreront pas entre les processeurs, car vous risquez de perdre la connexion à votre mémoire. Je ne suis pas sûr, comment copier des données pour chaque thread sur un seul processeur affecterait les performances, mais je suppose que ne pas copier pourrait améliorer la capacité de partager le contenu des caches de niveau supérieur, qui sont partagés entre les cœurs.
Dans tous les cas, de référence et de décider en fonction des mesures réelles.
La machine est-elle NUMA? – Mysticial
La question évidente est la suivante: cette mémoire est-elle constante pendant sa lecture ou est-elle sujette à des changements? –
@Mysticial, on peut espérer que toutes les architectures gérer efficacement les données de lecture multiples, et pas seulement un système NUMA. –