J'ai un problème de performance très étrange, lié à l'accès à la mémoire. L'extrait de code est:pourquoi l'accès à la mémoire est si lent?
#include <vector>
using namespace std;
vector<int> arrx(M,-1);
vector< vector<int> > arr(N,arrx);
...
for(i=0;i<N;i++){
for(j=0;j<M;j++){
//>>>>>>>>>>>> Part 1 <<<<<<<<<<<<<<
// Simple arithmetic operations
int n1 = 1 + 2; // does not matter what (actually more complicated)
// Integer assignment, without access to array
int n2 = n1;
//>>>>>>>>>>>> Part 2 <<<<<<<<<<<<<<
// This turns out to be most expensive part
arr[i][j] = n1;
}
}
N et M - sont des constantes de l'ordre de 1000 à 10000 ou plus. Lorsque je compile ce code (version finale), il faut environ 15 horloges pour le terminer si la partie 2 est commentée. Avec cette partie le temps d'exécution va jusqu'à 100+ horloges, donc presque 10 fois plus lent. Je m'attendais à ce que l'opération d'assignation soit beaucoup moins coûteuse que même des opérations arithmétiques simples. C'est en fait vrai si nous n'utilisons pas de tableaux. Mais avec ce tableau, l'affectation semble être beaucoup plus coûteuse. J'ai également essayé un tableau 1D au lieu de 2D - le même résultat (pour 2D est évidemment plus lent). J'ai également utilisé int ** ou int * à la place du vecteur < vecteur < int>> ou vecteur < int> - encore une fois le résultat est le même.
Pourquoi est-ce que j'obtiens des performances aussi médiocres dans l'assignation de réseau et puis-je le réparer?
Edit: Encore une observation: dans la partie 2 du code donné si l'on change l'affectation de
arr[i][j] = n1; // 172 clocks
à
n1 = arr[i][j]; // 16 clocks
la vitesse (nombre dans les commentaires) monte. Plus intéressant encore, si l'on change la ligne:
arr[i][j] = n1; // 172 clocks
à
arr[i][j] = arr[i][j] * arr[i][j]; // 110 clocks
vitesse est également plus élevé que pour une simple affectation est-il une différence entre la lecture et l'écriture de/à la mémoire? Pourquoi ai-je une performance aussi étrange?
Merci d'avance!
C'est plus qu'une simple affectation ... – AJG85
Vous pourriez obtenir de meilleurs résultats en utilisant un tableau à plat au lieu d'un 'vector' imbriqué. Essayez 'boost :: multiarray'. – pmr
et vous pourriez vouloir traiter les cellules dans l'ordre de la mémoire (une meilleure utilisation du cache). – ysdx