Pages : 1
#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
"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
Pages : 1