2010-06-23 5 views
2

Je pense à l'optimisation d'un programme en prenant un tableau linéaire et en écrivant chaque élément dans un emplacement arbitraire (de manière aléatoire du point de vue de la CPU) dans un autre tableau. Je ne fais que des écritures simples et je ne relis pas les éléments. Je comprends qu'une lecture scatted pour une unité centrale classique peut être assez lente car chaque accès provoquera un échec de mémoire cache et donc une attente du processeur. Mais je pensais qu'une écriture dispersée pouvait techniquement être rapide parce que le processeur n'attend pas de résultat, il n'a donc pas besoin d'attendre que la transaction soit terminée. Je ne suis malheureusement pas familier avec tous les détails de l'architecture de la mémoire CPU classique et donc il peut y avoir quelques complications qui peuvent entraîner cette lenteur.Vitesse d'écriture dispersée par rapport à la vitesse de lecture dispersée sur les processeurs Intel ou AMD modernes?

Est-ce que quelqu'un a déjà essayé?

(Je devrais dire que j'essaie d'inverser un problème que j'ai actuellement) J'ai actuellement un tableau linéaire à partir duquel je lis des valeurs arbitraires - une lecture dispersée - et c'est incroyablement lent à cause de tous les échecs de cache Je pense que je peux inverser cette opération dans une écriture éparpillée pour un gain de vitesse significatif.)

+0

Je serais surpris si les écritures dispersées étaient plus rapides, mais comme toujours, vous devriez tester et mesurer. –

Répondre

3

En général, vous payez une pénalité élevée pour les écritures dispersées à des adresses qui ne sont pas déjà dans le cache, car vous devez charger et stocker une ligne de cache complète pour chaque écriture, d'où les besoins en bande passante FSB et DRAM seront beaucoup plus élevés que pour les écritures séquentielles. Et bien sûr, vous risquez de manquer un cache à chaque écriture (quelques centaines de cycles généralement sur les processeurs modernes), et il n'y aura aucune aide de n'importe quel mécanisme de prélecture automatique.

+0

Pensez-vous que les instructions SSE spécifiques au cache seraient utiles, en particulier _mm_stream_ps dans le cas de données flottantes? La documentation MSDN indique que cette instruction "stocke les données dans un à l'adresse p sans polluer les caches". http://msdn.microsoft.com/en-us/library/78x83000(v=VS.80).aspx – bhouston

+0

Voici une réponse à la question _mm_stream_ps que je viens de poser: http://www.gamedev.net /community/forums/topic.asp?topic_id=532112&whichpage=1� – bhouston

+0

Vous * pouvez * être en mesure de régler les choses un peu, mais il serait probablement préférable d'investir cet effort dans la restructuration de votre algorithme afin qu'il écrit séquentiellement (ou au moins avec une localité raisonnable) si possible. –

2

Je dois admettre que ça a l'air plutôt hardcore. Mais je prends le risque et réponds quand même.

Est-il possible de diviser le tableau d'entrée en pages, et de lire/analyser chaque page plusieurs fois. À chaque passage de la page, vous ne traitez (ou ne produisez) que les données appartenant à un nombre limité de pages. De cette façon, vous obtenez seulement des échecs de cache au début de chaque boucle de la page d'entrée.

+0

Oui, cela semble faisable. Je pourrais le diviser en sous-classes et seulement lire les données dans cette gamme. Quelle taille de page recommanderiez-vous? Mes ensembles de date d'entrée et de sortie ont tous les deux une taille de 10 Mo. Il peut être préférable de séparer à la fois l'entrée et la sortie dans les pages - ainsi, N aurait des partitions avec M passes chacune. Je pourrais faire chacun de traverser plusieurs cœurs à la fois. – bhouston

Questions connexes