Nowe posty

xx konfiguracja sieci domowej (6)
Wczoraj o 23:58:47
clip Brak możliwości instalacji aplikacji na Opensuse Tumbleweed. (2)
Wczoraj o 23:35:02
xx petla while (11)
Wczoraj o 22:14:49
xx Repozytoria Archa (7)
Wczoraj o 21:43:06
xx Ktoś zna datę przejścia Minta 19.3 z bety do oficjala? (47)
Wczoraj o 14:28:28
xx Jak,Zrobić kopię całego dysku? (3)
Wczoraj o 08:39:41
xx Jaki linux na laptop/tablet hybrydowy? (11)
Wczoraj o 08:16:56
xx Brak rozdzielczości 16:9 ubuntu 19.04 (1)
Wczoraj o 01:46:25
xx Dziwne połączenia sieciowe! Co to jest? (14)
2019-12-13, 22:59:42
xx Conky - obraz z kamerki (11)
2019-12-13, 19:09:59

Autor Wątek: [openMP][C] - przerobienie rozszezenia perla na wielowątkowosc.  (Przeczytany 1637 razy)

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 28
    • Zobacz profil
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