J'ai une fonction qui est passée deux structures par référence. Ces structures sont composées de tableaux alloués dynamiquement. Maintenant, quand j'essaie d'implémenter OpenMP, j'obtiens un ralentissement et non une accélération. Je pense que cela peut être attribué à des problèmes de partage possibles. Voici une partie du code pour votre lecture attentive (C):OpenMP et structures partagées et pointeurs
void leap(MHD *mhd,GRID *grid,short int gchk)
{
/*-- V A R I A B L E S --*/
// Indexes
int i,j,k,tid;
double rhoinv[grid->nx][grid->ny][grid->nz];
double rhoiinv[grid->nx][grid->ny][grid->nz];
double rhoeinv[grid->nx][grid->ny][grid->nz];
double rhoninv[grid->nx][grid->ny][grid->nz]; // Rho Inversion
#pragma omp parallel shared(mhd->rho,mhd->rhoi,mhd->rhoe,mhd->rhon,grid,rhoinv,rhoiinv,rhoeinv,rhoninv) \
private(i,j,k,tid,stime)
{
tid=omp_get_thread_num();
printf("----- Thread %d Checking in!\n",tid);
#pragma omp barrier
if (tid == 0)
{
stime=clock();
printf("-----1) Calculating leap helpers");
}
#pragma omp for
for(i=0;i<grid->nx;i++)
{
for(j=0;j<grid->ny;j++)
{
for(k=0;k<grid->nz;k++)
{
// rho's
rhoinv[i][j][k]=1./mhd->rho[i][j][k];
rhoiinv[i][j][k]=1./mhd->rhoi[i][j][k];
rhoeinv[i][j][k]=1./mhd->rhoe[i][j][k];
rhoninv[i][j][k]=1./mhd->rhon[i][j][k];
}
}
}
if (tid == 0)
{
printf("........%04.2f [s] -----\n",(clock()-stime)/CLOCKS_PER_SEC);
stime=clock();
}
#pragma omp barrier
}/*-- End Parallel Region --*/
}
Maintenant, je l'ai essayé par défaut (partagé) et partagée (MHD), mais ne montrent aucun signe d'amélioration. Se pourrait-il que, puisque les tableaux sont attribués
mhd->rho=(double ***)newarray(nx,ny,nz,sizeof(double));
en déclarant que la structure ou le pointeur sur l'élément de la structure que je partage pas vraiment la mémoire seulement les pointeurs vers elle? Oh et nx = 389 ny = 7 et nz = 739 dans cet exemple. Le temps d'exécution pour cette section en série est de 0,23 [s] et 0,79 [s] pour 8 threads.
J'ai essayé de faire juste que ... pas de dés en même temps d'exécution. J'ai aussi essayé de mettre toutes les données dans des tableaux locaux (rhotemp) et d'y accéder à la place des valeurs dans la même structure. – Lazer