2012-05-24 3 views
6

J'écris une application en C++ qui a besoin de lire plusieurs fois de la même mémoire à partir de nombreux threads. Ma question est d'un point de vue performance, il vaudra mieux copier la mémoire pour chaque thread ou donner à tous les threads le même pointeur et avoir tous accès à la même mémoire.accès mémoire contre copie de mémoire

Merci

+1

La machine est-elle NUMA? – Mysticial

+1

La question évidente est la suivante: cette mémoire est-elle constante pendant sa lecture ou est-elle sujette à des changements? –

+1

@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. –

Répondre

6

Il n'y a pas de réponse définitive de la petite information que vous avez donné à votre système cible et ainsi de suite, mais sur un PC normal, très probablement le plus rapide sera de ne pas copier. Une des raisons pour lesquelles la copie peut être lente est qu'elle peut entraîner des échecs de mémoire cache si la zone de données est volumineuse. Un PC normal cache très efficacement l'accès en lecture seule à la même zone de données entre les threads, même si ces threads sont exécutés sur des cœurs différents.

L'un des avantages explicitement répertoriés par Intel pour leur approche de la mise en cache est "Allows more data-sharing opportunities for threads running on separate cores that are sharing cache". C'est à dire. ils encouragent une pratique où vous n'avez pas besoin de programmer les threads pour mettre explicitement en cache les données, le CPU le fera pour vous.

1

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.

Questions connexes