Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/11/2011, à 00:21

nicolas66

OpenMP

Bonjour,

Le code C ci-après parallélise une convolution sur un volume avec une dimensionnalité <= 4. Lorsque t>1, les performances sont au rendez-vous. En revanche, lorsque t=1, la boucle sur t semble être zappée par gcc ou OpenMP et le temps de calcul est le même. Est-il possible de demander à ne pas zapper cette boucle sans augmenter la valeur de output->st ? (j'ai essayé d'augmenter output->st et de tester ensuite mais rien n'y fait).

for( c=0; c<output->nc; c++ )
{
    #pragma omp parallel for num_threads(2) private(x,y,z,xx,yy,zz,tt,sum,count)
    for( t=0; t<output->st; t++ )
    {
        for( z=0; z<output->sz; z++ )
        {
            for( y=0; y<output->sy; y++ )
            {
                for( x=0; x<output->sx; x++ )
                {
                    count = 0;
                    sum = 0.0f;

                    for( tt=-radius; tt<=+radius; tt++ )
                    {
                        for( zz=-radius; zz<=+radius; zz++ )
                        {
                            for( yy=-radius; yy<=+radius; yy++ )
                            {
                                for( xx=-radius; xx<=+radius; xx++ )
                                {
                                    if( !is_inside_volume(output, x+xx, y+yy, z+zz, t+tt) )
                                        continue;

                                    sum += get_value_volume(input, x+xx, y+yy, z+zz, t+tt, c);
                                    count++;
                                }
                            }
                        }
                    }

                    set_value_volume(output, x, y, z, t, c, sum/count);
                }
            }
        }
    }
}

Merci d'avance smile


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#2 Le 17/11/2011, à 18:39

nicolas66

Re : OpenMP

En creusant, j'ai finalement trouvé deux solutions :

1) Parcourir l'ensemble du volume avec une unique boucle et calculer les offets x, y, z et t.
2) utiliser la clause collapse(4) sur la première boucle (mais dispo qu'à partir de gcc 4.4)


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne