У меня есть функция, которая передает две структуры по ссылке. Эти структуры состоят из динамически распределенных массивов. Теперь, когда я пытаюсь реализовать OpenMP, я получаю замедление, а не ускорение. Я думаю, что это можно объяснить возможными проблемами обмена. Вот некоторые из кода для прочтения (C):OpenMP и общие структуры и указатели
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 --*/
}
Теперь я попытался по умолчанию (общий) и общий (MHD), но ни какие-либо признаки улучшения. Может быть, так как массивы выделяются
mhd->rho=(double ***)newarray(nx,ny,nz,sizeof(double));
Это объявляя структуру или указатель на элемент структуры, что я на самом деле не обмен память на указатели на него? Oh и nx = 389 ny = 7 и nz = 739 в этом примере. Время выполнения для этого раздела в последовательном порядке составляет 0,23 [с] и 0,79 [с] для 8 потоков.
Я пытался делать просто ... нет кубика же время выполнения. Я также попытался поместить все данные в локальные массивы (rhotemp) и получить доступ к ним вместо значений в структуре. – Lazer