Question

Le maximum théorique de bande passante mémoire pour un processeur Core 2 avec une mémoire DDR3 à double canal est impressionnant: selon le Article Wikipedia sur l'architecture, 10+ ou 20+ gigaoctets par seconde. Cependant, les appels stock memcpy () n'atteignent pas cet objectif. (3 Go / s est le plus élevé que j'ai jamais vu sur de tels systèmes.) Probablement, cela est dû au fait que le fournisseur de système d'exploitation souhaite que memcpy () soit réglé pour chaque ligne de processeur en fonction des caractéristiques du processeur, il est donc implémenté de mémoriser devrait être raisonnable sur un grand nombre de marques et de lignes.

Ma question: Existe-t-il une version hautement optimisée et disponible gratuitement pour les processeurs Core 2 ou Core i7 pouvant être utilisée dans un programme C? Je suis sûr que je ne suis pas la seule personne à en avoir besoin, et ce serait un gaspillage d'efforts pour tout le monde d'optimiser leur propre mémoire ().

Était-ce utile?

La solution

Si vous spécifiez / ARCH: SSE2 à MSVC, celui-ci devrait vous fournir une mémoire accordée (au moins, la mienne le fait).

À défaut, utilisez vous-même les composants intrinsèques de chargement / stockage alignés SSE pour copier la mémoire en gros morceaux, en utilisant un dispositif de Duff de lecture de mots si nécessaire pour traiter la tête et la queue des données afin de les aligner. Vous devrez également utiliser les éléments intrinsèques de la gestion du cache pour obtenir de bonnes performances.

Votre facteur limitant est probablement les erreurs de cache et la bande passante southbridge, plutôt que les cycles du processeur. Étant donné qu'il y aura toujours beaucoup d'autres trafics sur le bus mémoire, je suis généralement heureux d'obtenir environ 90% du débit de bande passante mémoire théorique dans de telles opérations.

Autres conseils

Lors de la mesure de la bande passante, avez-vous pris en compte que memcpy était à la fois une lecture et une écriture, de sorte qu'une mémoire copiée à 3 Go / s correspond en réalité à une bande passante de 6 Go / s?

N'oubliez pas que la bande passante est maximale théorique - l'utilisation dans le monde réel sera beaucoup plus faible. Par exemple, une page est défectueuse et votre bande passante passera à Mo / s.

memcpy / memmove sont des éléments intrinsèques du compilateur et seront généralement intégrés à rep movsd (ou aux instructions SSE appropriées si votre compilateur peut le cibler). Il est peut-être impossible d'améliorer le code là-dessus, car les processeurs modernes gèrent très bien les instructions de repérage de ce type.

Vous pouvez écrire le vôtre. Essayez d’utiliser le compilateur d'optimisation Intel directement cibler l'architecture?

Intel produit également quelque chose appelé VTune (compilateur et indépendant du langage) pour optimiser les applications.

Voici un article sur l'optimisation d'un moteur de jeu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top