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.
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;
}