Je travaille sur le code qui compare les histogrammes d'image, acheter la corrélation de calcul, l'intersection, ChiSquare et quelques autres méthodes. L'apparence générale de ces fonctions sont très similaires les unes aux autres.comparaison openMP histogramme
Habituellement, je travaille avec pthreads, mais cette fois, j'ai décidé de construire un petit prototype avec openMP (en raison de sa simplicité) et voir quel genre de résultats je vais obtenir.
Ceci est un exemple de comparaison par corrélation, le code est identique à l'implémentation en série sauf une ligne de la boucle openMP.
double comp(CHistogram* h1, CHistogram* h2){
double Sa = 0;
double Sb = 0;
double Saa = 0;
double Sbb = 0;
double Sab = 0;
double a, b;
int N = h1->length;
#pragma omp parallel for reduction(+:Sa,Sb,Saa,Sbb,Sab) private(a ,b)
for (int i = 0; i<N;i++){
a =h1->data[i];
b =h2->data[i];
Sa+=a;
Sb+=b;
Saa+=a*a;
Sbb+=b*b;
Sab+=a*b;
}
double sUp = Sab - Sa*Sb/N;
double sDown = (Saa-Sa*Sa/N)*(Sbb-Sb*Sb/N);
return sUp/sqrt(sDown);
}
Existe-t-il d'autres moyens d'accélérer cette fonction avec openMP?
Merci! PS: Je sais que le moyen le plus rapide serait de comparer différentes paires d'histogrammes sur plusieurs threads, mais cela ne s'applique pas à ma situation puisque seulement deux histogrammes sont disponibles à la fois.
Testé sur la machine quad core
J'ai un peu d'incertitude, sur un plus long terme OpenMP semble de meilleurs résultats qu'un série. Mais si je le compare juste pour un seul histogramme et mesure le temps en useconds, alors la série est plus rapide dans environ 20 fois.
Je suppose que openmp met une certaine optimisation une fois qu'il voit dehors pour la boucle. Mais dans une vraie solution, je vais avoir du code entre les comparaisons d'histogrammes, et je ne suis pas sûr que cela se fera de la même manière. OpenMp prend du temps pour configurer la région parallèle.
Quelle accélération obtenez-vous par rapport à l'implémentation en série? (Et combien de cœurs avez-vous/utilisez-vous?) – Mat
Que diriez-vous d'utiliser des pointeurs plutôt que d'utiliser des données [i]? – kenny
@kenny, ceci est impossible dans un programme parallèle altbeit étant une suggestion étrange compte tenu de la puissance des optimiseurs – unkulunkulu