2012-06-27 3 views
2

Je souhaite tester un programme avec différents niveaux d'utilisation du bus mémoire. Par exemple, je voudrais savoir si mon programme fonctionne comme prévu lorsque d'autres processus utilisent 50% du bus mémoire. Comment pourrais-je simuler ce type de perturbation?Comment saturer le bus mémoire

Ma tentative a été de lancer un processus avec plusieurs threads, chaque thread lit fait au hasard d'un grand bloc de mémoire. Cela n'a pas semblé avoir un grand impact sur mon programme. Mon programme a beaucoup d'opérations de mémoire, donc je m'attendrais à ce qu'une perturbation significative soit perceptible. Je veux saturer le bus mais sans utiliser trop de cycles CPU, de sorte que toute dégradation des performances ne soit provoquée que par des conflits de bus.

Notes:

  • J'utilise un processeur Xeon E5645, mémoire DDR3
+2

Vous devez définir quelle plate-forme vous utilisez et quel type de mémoire. Est-ce un 8bit 8051, un ARM-Cortex M3 ou un Intel Core-i7? Cela pourrait faire une petite différence. – jeb

Répondre

1

Mon premier instinct serait de mettre en place un tas d'opérations DMA pour rebondir données autour sans utiliser la CPU trop. Tout dépend du système d'exploitation que vous utilisez et du matériel. Est-ce un système embarqué? Je serais heureux de donner plus de détails dans les commentaires.

+0

Bonne idée. Je vais essayer. J'utilise un processeur Xeon E5645, Fedora Linux – user16367

+0

Hmm, en fait, si je fais DMA, ne serait-il pas utiliser un bus différent de celui de mon programme? – user16367

+0

Non, c'est une sorte de noyau séparé dans le processeur, il utilise le même bus mémoire (à moins que vous ayez une mémoire bizarre à double port, ce que vous n'avez probablement pas pour un Xeon). Notez qu'il est très probable qu'il contourne le cache de votre processeur, ce qui n'affectera que les performances pour les échecs de cache. –

3

Le modèle mental de « processus utilisent 50% du bus mémoire » n'est pas un grand. Un thread qui a acquis un core et accède à de la mémoire qui n'est pas dans les caches utilise le bus mémoire.

Obtenir un fil pour saturer le bus est simple, il suffit d'utiliser memcpy(). Copiez plusieurs fois le montant qui correspond au dernier cache et réchauffez-le en l'exécutant plusieurs fois afin qu'il n'y ait pas de défaut de page pour ralentir le code.

0

J'utilise SSE2 movntps instructions pour diffuser les données, pour éviter les conflits de cache pour l'autre fil dans le même noyau. Peut-être dérouler cette boucle 16 fois pour minimiser le nombre d'instructions par transfert de mémoire. Alors que l'idée DMA semble bonne, le manuel lié est vieux et pour 32bit linux et votre modèle de processeur me fait penser que vous avez probablement un os 64bit, ce qui me fait me demander combien de cela est encore correct. Et bug dans votre code de test peut vissez votre disque dur dans le pire des cas.