Forum Linux.pl

Programowanie => C/C++ => Wątek zaczęty przez: bartekn80 w 2014-08-10, 07:26:24

Tytuł: [openMP][C] - przerobienie rozszezenia perla na wielowątkowosc.
Wiadomość wysłana przez: bartekn80 w 2014-08-10, 07:26:24
Witam
Probuje przerobic rozszezenie na openmp jednak nie zabardzo mi to wychodzi. Tzn pewnie gdzies robie jakis blad z alokacja pamieci tylko nie wiem gdzie.

Mogl bym prosic a jakies wskazówki jak uczynic tą funkcje wielowątkowa. Na tym etapie na razie wyskakuje mi blad ochrony pamieci po kilku petlach.
Zmodyfikowac taka funkcje na openmp
void _som_train(SV* self,IV epochs) {
IV i,X,Y,bx,by,epoch;
NV bd,l,sigma,*n;
AV **org,**veg,*sample;
I32 p,pick,nitems,oitems,vitems,drnd;
MAGIC *mg;
SOM_GENERIC *som;
bool wantarray;
void (*neiguts)(SOM_GENERIC* som,NV sigma,IV X0,IV Y0,NV* n);
dXSARGS;



int R;
if ( !(mg = selfmagic(self)) )
croak("self has no magic!");
som = self2somptr(self,mg);

if ( epochs < 1 )
epochs = 1;

if ( items < 3 )
croak("no data to learn");

oitems = items - 2;
Newx(org,oitems,AV*);
Newx(veg,oitems,AV*);

for ( i=2 ; i if ( SvTYPE(SvRV(ST(i))) != SVt_PVAV )
croak("training item %i is not an array ref", (int)i);
else
org[i-2] = (AV*)SvRV(ST(i));

som->LAMBDA = epochs / log( som->Sigma0 );

X = som->X;
Y = som->Y;

nitems = X*Y;
Newx(n,nitems,NV);

if ( som->type == SOMType_Torus )
neiguts = _torus_neiguts;
else if ( som->type == SOMType_Hexa )
neiguts = _hexa_neiguts;
else if ( som->type == SOMType_Rect )
neiguts = _rect_neiguts;
else
croak("unknown type");

wantarray = GIMME_V == G_ARRAY ? TRUE : FALSE;

/* should this be moved somewhere more global? */
if ( !PL_srand_called ) {
seedDrand01((Rand_seed_t)(time(NULL)+PerlProc_getpid()));
PL_srand_called = TRUE;
}

sp = mark;

int dd=0;
#pragma omp parallel default(shared)
{
#pragma omp for
for ( epoch=1 ; epoch<=epochs ; epoch++ ) {

dd++;
printf("epoch: %d \\n", dd);
som->T = epoch;
sigma = som->Sigma0 * exp(-epoch / som->LAMBDA);
l = som->L0 * exp(-epoch / epochs);

Copy(org,veg,oitems,AV*);
vitems = oitems;

/*
while ( vitems > 0 ) {
*/

for(vitems=oitems; vitems>0; vitems--) {


/*
pick = (I32)(Drand01() * vitems);
*/

drnd = Drand01();
pick = drnd * vitems;

sample = (AV*)veg[pick];

/* optimze me! */
for ( p=pick+1 ; p R=p-1;
veg[R] = veg[p];
}

/*
vitems--;
*/
_bmuguts(som,sample,&bx,&by,&bd);

if ( wantarray ) XPUSHs(newSVnv(bd));

for ( i=0 ; i neiguts(som,sigma,bx,by,n);

_adjustn(som,l,sigma,n,sample);
}

}
}


Safefree(n);
Safefree(org);
Safefree(veg);

PUTBACK;
}
caly kod jest pod tym linkiem http://pastebin.com/UE2JHRuc