2017-04-18 4 views
1

Je génère du code où je copie n mots d'un emplacement de mémoire à un autre emplacement de mémoire sans chevauchement. n est connu statiquement.Combien de mots valent un memcpy?

Actuellement, j'émets un grand nombre d'instructions de chargement suivies d'un grand nombre d'instructions de stockage, mais je soupçonne qu'à partir d'une certaine valeur de n, l'appel memcpy serait plus rapide.

Y a-t-il une ligne directrice bien connue sur le nombre de mots que vous devez copier pour que memcpy en vaille la peine?

+2

Souvent, 'memcpy' est un compilateur intrinsèque, ce qui signifie que si vous utilisez toujours' memcpy', le compilateur devrait prendre cette décision pour vous. –

+0

Donc, je peux raisonnablement utiliser 'memcpy' même pour copier des mots simples, et peut-on cesser de s'inquiéter? –

+2

Autant que je me souvienne (et il a fallu longtemps pour optimiser un code C, donc je pourrais me tromper), le compilateur remplacera typiquement 'memcpy' pour (par exemple) un seul mot avec la mémoire en ligne équivalente se déplace (ou copie de registre, ou même rien dans certains cas). Je suggère de vérifier l'assembleur généré sur un simple test-case pour être sûr, cependant. –

Répondre

1

Le code le plus optimisé dépend de l'architecture de votre processeur. Le chemin de données, la taille du registre, le nombre de registres de données disponibles et le cache sont quelques-uns des paramètres qui détermineront le code le plus optimisé.

Je ne sais pas comment votre compilateur spécifique traitera de la fonction memcpy, mais il y a quelques points qui peuvent vous aider à rédiger un code de copie optimisé:

  • Toujours vérifier le code assembleur généré le cas échéant pour savoir si le code actuel est le plus optimisé.

  • Si vous avez n données libres de registre, alors chargez seulement n valeur et stockez-les pour éviter la nécessité d'allouer de la mémoire de la pile. Traiter les registres est beaucoup plus rapide que de traiter d'autres souvenirs. Si votre processeur possède des modes d'adressage qui incrémentent automatiquement les adresses après les avoir utilisées, et si c'est ce que vous voulez faire, assurez-vous que l'assemblage généré le fait.

  • La lecture de valeurs contiguës améliorera les performances du cache, ce qui vous donnera plus d'optimisation. Dans la mesure du possible, essayez d'utiliser le chemin de données complet avec les instructions de chargement et de stockage. Si des instructions de chargement et de stockage SIMD sont disponibles, veillez à les utiliser.