2011-07-31 6 views
3

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 Results Vertical time horisontal iterations over histogram of length 255

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.

+0

Quelle accélération obtenez-vous par rapport à l'implémentation en série? (Et combien de cœurs avez-vous/utilisez-vous?) – Mat

+0

Que diriez-vous d'utiliser des pointeurs plutôt que d'utiliser des données [i]? – kenny

+0

@kenny, ceci est impossible dans un programme parallèle altbeit étant une suggestion étrange compte tenu de la puissance des optimiseurs – unkulunkulu

Répondre

2

Cette surcharge signifie que vous devez faire attention à ce que le surcoût ne soit pas supérieur à la performance obtenue en configurant une région parallèle. Dans votre cas, cela signifie que seulement lorsque N atteint un certain nombre, MP va accélérer le calcul.

Vous devriez penser à des moyens de réduire le nombre total d'appels openMP, par exemple est-il possible de configurer une région parallèle en dehors de cette fonction afin de comparer différents histogrammes en parallèle?