Cela peut sembler un peu ouvert, mais j'ai du mal à optimiser un morceau de code C++ pour plusieurs processeurs et le cache.Optimisation du cache du code C++
Plus important que plusieurs processeurs est le cache: J'Enumérer les 2 boucles imbriquées
for(int i=0; i<n; i++){
//do a little something here with a single array
for(int j=0; j<whoaAnotherArray[n].size(); j++){
* access array[i][j] and otherArray[i][j] and store in a variable
- an example is: "int x = array[i][j] + otherArray[i][j]"
* compare variable to some other array[index calculated from i and j]
- an example is: "if (x < yetAnotherArray[i*n+j]){ //do something to yetAnotherArray }"
}
}
Mes tableaux (array et otherArray) sont de très grande taille . n est leur taille.
Y at-il un moyen de rendre ce cache plus convivial? Je suis déjà passé de l'utilisation de listes liées, qui sont terribles pour le cache. J'ai lu quelque part que mon ordre d'accès [i] [j] est également efficace dans le cache. FWIW, ceci fait partie d'un algorithme de détection de cycle de poids négatif.
Je pensais que peut-être puisque mes tableaux sont si énormes (ce sont des tableaux d'entiers btw), serait-il préférable de les décomposer un peu afin qu'ils s'intègrent mieux dans le cache? Mais je ne suis pas sûr si c'est vrai ou si c'est le cas, comment s'y prendre.
J'ai également commencé à utiliser openmp. La seule chose que je fais ajoute
#pragma omp parallel for
avant le droit pour les boucles, et j'obtenir une utilisation correcte. Je voudrais apprendre comment mieux utiliser le parallélisme mais au-delà des boucles dans mon code je ne suis pas sûr de ce que je peux faire. Et tout le temps: j'essaie d'être amical en cache.
Qu'est-ce que vous essayez d'atteindre ici? Je suis assez sûr qu'il existe une solution plus efficace que O (N²) là-bas. – jwueller
Habituellement un bon compilateur (surtout quand vous le lui demandez explicitement) insérez des instructions * precache * dans la boucle. – ruslik
@elusive Excuses, ce n'est pas O (N^2) mais O (N) parce que ma boucle interne n'est pas N. Je vais corriger ça ... @ruslik J'utilise g ++, comment je fais ça? – Sam