Je pense qu'il n'y a pas grand-chose à faire qui fasse une grande différence. Peut-être que vous pouvez accélérer un peu avec OpenMP ou SSE. Mais les processeurs modernes sont déjà assez rapides. Dans certaines applications, la bande passante/latence de la mémoire est en fait le goulot d'étranglement et la situation empire. Nous avons déjà trois niveaux de cache et avons besoin d'algorithmes de prélecture intelligente pour éviter d'énormes retards. Il est donc logique de penser aussi aux modèles d'accès à la mémoire.Par exemple, si vous implémentez un tel multiply
et un add
et l'utiliser comme ceci:
void multiply(float vec[], float factor, int size)
{
for (int i=0; i<size; ++i)
vec[i] *= factor;
}
void add(float vec[], float summand, int size)
{
for (int i=0; i<size; ++i)
vec[i] += summand;
}
void foo(float vec[], int size)
{
multiply(vec,2.f,size);
add(vec,9.f,size);
}
vous passez essentiellement deux fois sur le bloc de mémoire. En fonction de la taille du vecteur, il peut ne pas rentrer dans le cache L1, auquel cas le passage à deux reprises ajoute du temps supplémentaire. C'est évidemment mauvais et vous devriez essayer de garder les accès mémoire "locaux". Dans ce cas, une seule boucle
void foo(float vec[], int size)
{
for (int i=0; i<size; ++i) {
vec[i] = vec[i]*2+9;
}
}
est susceptible d'être plus rapide. En règle générale: Essayez d'accéder à la mémoire de manière linéaire et essayez d'accéder à la mémoire "localement", ce qui veut dire, essayez de réutiliser les données qui sont déjà dans le cache L1. Juste une idée.
Vous semblez déjà connaître la réponse. Êtes-vous coincé d'une certaine façon, ou attendez-vous simplement que quelqu'un d'autre écrive le code pour vous? –
Ce n'est pas Rent-a-Coder! – Skizz
Quelle est la taille attendue du tableau (> 1,> 10,> 100,> 1000,> 10000)? vous envisagez d'utiliser plusieurs cœurs (threads) dans votre cas? Y a-t-il des contraintes connues à l'avance sur le tableau, alors que d'autres comptent un multiple de 4? – Suma