Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Pitanje sa device pointerima

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
GCOX
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 24. 10. 2006. (12:43:03)
Postovi: (A8)16
Spol: muško
Sarma = la pohva - posuda
-9 = 18 - 27
Lokacija: SPLIT_ZAGREB

PostPostano: 22:17 pet, 23. 3. 2012    Naslov: Pitanje sa device pointerima Citirajte i odgovorite

pretpostavimo da imamo ovako nešto:

[code:1]A_d_size=5*sizeof(double);
double *A_d = 0;
CUDA_CALL(cudaMalloc((void**)&A_d, A_d_size));
B_d_size=5*sizeof(double);
double *B_d = 0;
CUDA_CALL(cudaMalloc((void**)&C_d, B_d_size));[/code:1]

da li se na hostu može napraviti "swap" tih pointera (A pokazuje na polje B i obratno) ili se mora napraviti novi kernel za swap?
pretpostavimo da imamo ovako nešto:

Kod:
A_d_size=5*sizeof(double);
double *A_d = 0;
   CUDA_CALL(cudaMalloc((void**)&A_d, A_d_size));
B_d_size=5*sizeof(double);
double *B_d = 0;
   CUDA_CALL(cudaMalloc((void**)&C_d, B_d_size));


da li se na hostu može napraviti "swap" tih pointera (A pokazuje na polje B i obratno) ili se mora napraviti novi kernel za swap?


[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
Gino
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 11. 09. 2008. (10:54:06)
Postovi: (370)16
Sarma = la pohva - posuda
-29 = 108 - 137
Lokacija: Pula

PostPostano: 10:16 sub, 24. 3. 2012    Naslov: Citirajte i odgovorite

meni se cini posve smisleno da se to moze svugdje zamjeniti, a logicnije mi se cak cini u host-u, u svakom slucaju, mislim da to ni nije problem isprobati...
meni se cini posve smisleno da se to moze svugdje zamjeniti, a logicnije mi se cak cini u host-u, u svakom slucaju, mislim da to ni nije problem isprobati...



_________________
Mario Berljafa
[Vrh]
Korisnički profil Pošaljite privatnu poruku
GCOX
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 24. 10. 2006. (12:43:03)
Postovi: (A8)16
Spol: muško
Sarma = la pohva - posuda
-9 = 18 - 27
Lokacija: SPLIT_ZAGREB

PostPostano: 11:58 sub, 24. 3. 2012    Naslov: Citirajte i odgovorite

[quote="Gino"]meni se cini posve smisleno da se to moze svugdje zamjeniti, a logicnije mi se cak cini u host-u, u svakom slucaju, mislim da to ni nije problem isprobati...[/quote]

Isproba san, možda san nešto falia u postupku, no meni je cak nelogicno da se može u host-u to napravit pošto iz host-a ne možeš ni pristupit elementima polja alociranog na device-u, pa su pointeri samo još veći nivo "apstrakcije".
Rješija san problem pozivanjem "swap" kernela, no opet me zanima jel postoji neki jednostavniji način sa recimo:
cudaError_t cudaMemcpy (void  dst, const void  src, size_t count, [color=red]cudaMemcpyDeviceToDevice[/color])
Gino (napisa):
meni se cini posve smisleno da se to moze svugdje zamjeniti, a logicnije mi se cak cini u host-u, u svakom slucaju, mislim da to ni nije problem isprobati...


Isproba san, možda san nešto falia u postupku, no meni je cak nelogicno da se može u host-u to napravit pošto iz host-a ne možeš ni pristupit elementima polja alociranog na device-u, pa su pointeri samo još veći nivo "apstrakcije".
Rješija san problem pozivanjem "swap" kernela, no opet me zanima jel postoji neki jednostavniji način sa recimo:
cudaError_t cudaMemcpy (void  dst, const void  src, size_t count, cudaMemcpyDeviceToDevice)


[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 16:18 sub, 24. 3. 2012    Naslov: Citirajte i odgovorite

Pointer je pointer - obična integer varijabla.
Tako i u ovom slučaju: A_d i B_d su dva pointera na host-u, bez obzira što pokazuju na device memoriju.
Kao što možete zamijeniti sadržaje bilo kojim dvjema varijablama, tako možete na host-u zamijeniti i sadržaje tih pointera.
[code:1]double *const tmp = A_d;
A_d = B_d;
B_d = tmp;[/code:1]
Ono što ne možete na host-u je zamijeniti sadržaje onog na što ti pointeri pokazuju, već to morate obaviti tamo gdje ti podaci stoje - na device-u.

Probajte razmišljati ovako:
Pointer sadrži neku adresu.
Tu adresu ne moraju moći svi razumjeti.
U našem slučaju, adresu u device memoriji host ne razumije.
Device može razumjeti samo "specijalne" adrese na host-u, kako smo rekli kod mapiranja.
Ali to što možda ne prepoznajete što je sadržaj dvije kutije ne sprečava vas da im zamijenite sadržaje - isto tako host može zamijeniti sadržaje pointera makar ne zna kako ih tumačiti.

P.S. Nadam se da sam dobro shvatio pitanje.
Ako ne, vičite da se usuglasimo.
Pointer je pointer - obična integer varijabla.
Tako i u ovom slučaju: A_d i B_d su dva pointera na host-u, bez obzira što pokazuju na device memoriju.
Kao što možete zamijeniti sadržaje bilo kojim dvjema varijablama, tako možete na host-u zamijeniti i sadržaje tih pointera.
Kod:
double *const tmp = A_d;
A_d = B_d;
B_d = tmp;

Ono što ne možete na host-u je zamijeniti sadržaje onog na što ti pointeri pokazuju, već to morate obaviti tamo gdje ti podaci stoje - na device-u.

Probajte razmišljati ovako:
Pointer sadrži neku adresu.
Tu adresu ne moraju moći svi razumjeti.
U našem slučaju, adresu u device memoriji host ne razumije.
Device može razumjeti samo "specijalne" adrese na host-u, kako smo rekli kod mapiranja.
Ali to što možda ne prepoznajete što je sadržaj dvije kutije ne sprečava vas da im zamijenite sadržaje - isto tako host može zamijeniti sadržaje pointera makar ne zna kako ih tumačiti.

P.S. Nadam se da sam dobro shvatio pitanje.
Ako ne, vičite da se usuglasimo.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Cobs
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 21. 01. 2008. (13:32:15)
Postovi: (206)16
Spol: muško
Sarma = la pohva - posuda
26 = 40 - 14
Lokacija: Geto

PostPostano: 16:39 čet, 28. 6. 2012    Naslov: Citirajte i odgovorite

Imam jedan problem vezan uz zadaću, ali je u principu vezan uz kopiranje memorije sa Devica na Device
u programu koristim threadove ( pthread.h ) i u biti glavni princip mi je da svaki od tih treadova radi svoj dio na svojo grafičkoj kartici. Znači
thread 0 se postavi na device 0, thread 1 na device 1...

pri pozivu funkcije pthread_create() u funkciju koja se poziva pri kreiranju threada proslijedim strukturu
[code:1]struct podaci{
double* pokazivac;
struct podaci* next;
...
}
[/code:1]

a ta struktura ima pokazivač na sljedeću u nizu ( 0->1->2->3)
nakon što svaki thread "zauzme" svoj device alociram memoriju na device-u na koju mi pokazuje [tt]pokazivac[/tt].

Cilj mi je tu memoriju proslijediti na susjedni GPU ( 0->1, 1->2, 2->3 ) i zato pokazivač na susjednu strukturu ( što izgleda nije dobro rješenje ).

Pozivam ovu funkciju:

[code:1]
cudaMemcpy( podaci->next->pokazivac, double_memorija, dim*sizeof(double), cudaMemcpyDeviceToDevice )
[/code:1]

Tj. želim sa devica 0 poslati double_memoriju u strukturu kojom barata thread 1 koji operira po device-u 1 i na taj način da ona bude na raspolaganju device-u 1. No izbacuje mi grešeke, tj. kopiranje ne radi. Javlja cudaErrorInvalidValue, tj. da memorije koje koristim u kopiranju nisu dobre ( ako nakon poziva funkcije pristupim memoriji program se ruši, a ponekad i bez pristupanja ).
Sad jel uopće idem u pravom smjeru ili sam promašio? Ak netko ima primjer sa nekim boljim pristupom može link? Hvala
( struktura podaci mi se nalazi na hostu, što vidim kao razlog rušenja programa, ali memorija podaci->next->pokazivac je na memoriji grafike pa zato mi u biti nije jasno što mi je krivo )
Mogu tu istu memoriju prekopirat na host pa onda prebacit na drugi device, al mi nema logike tak radit kad je memorija već na grafici, a i puno je brže...
Imam jedan problem vezan uz zadaću, ali je u principu vezan uz kopiranje memorije sa Devica na Device
u programu koristim threadove ( pthread.h ) i u biti glavni princip mi je da svaki od tih treadova radi svoj dio na svojo grafičkoj kartici. Znači
thread 0 se postavi na device 0, thread 1 na device 1...

pri pozivu funkcije pthread_create() u funkciju koja se poziva pri kreiranju threada proslijedim strukturu
Kod:
struct podaci{
          double* pokazivac;
          struct podaci* next;
         ...
}


a ta struktura ima pokazivač na sljedeću u nizu ( 0→1→2→3)
nakon što svaki thread "zauzme" svoj device alociram memoriju na device-u na koju mi pokazuje pokazivac.

Cilj mi je tu memoriju proslijediti na susjedni GPU ( 0→1, 1→2, 2→3 ) i zato pokazivač na susjednu strukturu ( što izgleda nije dobro rješenje ).

Pozivam ovu funkciju:

Kod:

cudaMemcpy( podaci->next->pokazivac, double_memorija, dim*sizeof(double), cudaMemcpyDeviceToDevice )


Tj. želim sa devica 0 poslati double_memoriju u strukturu kojom barata thread 1 koji operira po device-u 1 i na taj način da ona bude na raspolaganju device-u 1. No izbacuje mi grešeke, tj. kopiranje ne radi. Javlja cudaErrorInvalidValue, tj. da memorije koje koristim u kopiranju nisu dobre ( ako nakon poziva funkcije pristupim memoriji program se ruši, a ponekad i bez pristupanja ).
Sad jel uopće idem u pravom smjeru ili sam promašio? Ak netko ima primjer sa nekim boljim pristupom može link? Hvala
( struktura podaci mi se nalazi na hostu, što vidim kao razlog rušenja programa, ali memorija podaci→next→pokazivac je na memoriji grafike pa zato mi u biti nije jasno što mi je krivo )
Mogu tu istu memoriju prekopirat na host pa onda prebacit na drugi device, al mi nema logike tak radit kad je memorija već na grafici, a i puno je brže...


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 17:29 čet, 28. 6. 2012    Naslov: Citirajte i odgovorite

@Cobs:

Da li nakon alokacije memorije, a prije cudaMemcpy ima ikakva sinkronizacija CPU threadova?
Ako ne, to je moguci razlog (da neki threadovi nisu jos alocirali memoriju u koju se pokusava pisati).
Preporucam sinkronizaciju barijerom (pthread_barrier_{init,wait}).

Ako to nije problem, stignite sutra na konzultacije (na math) da to detaljnije pogledamo.
Recimo oko 14h, ili se dogovorimo mailom za neki drugi termin.
@Cobs:

Da li nakon alokacije memorije, a prije cudaMemcpy ima ikakva sinkronizacija CPU threadova?
Ako ne, to je moguci razlog (da neki threadovi nisu jos alocirali memoriju u koju se pokusava pisati).
Preporucam sinkronizaciju barijerom (pthread_barrier_{init,wait}).

Ako to nije problem, stignite sutra na konzultacije (na math) da to detaljnije pogledamo.
Recimo oko 14h, ili se dogovorimo mailom za neki drugi termin.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Cobs
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 21. 01. 2008. (13:32:15)
Postovi: (206)16
Spol: muško
Sarma = la pohva - posuda
26 = 40 - 14
Lokacija: Geto

PostPostano: 17:55 čet, 28. 6. 2012    Naslov: Citirajte i odgovorite

Krenuo sam pisati već verziju sa kopiranjem preko hosta jer na ovom već predugo ( još od jučer ) razbijam glavu i nisam našao odgovor, a baš i nema vremena ( bile su uključene sinkronizacije pa tu nije trebao biti neki problem ).
Krenuo sam pisati već verziju sa kopiranjem preko hosta jer na ovom već predugo ( još od jučer ) razbijam glavu i nisam našao odgovor, a baš i nema vremena ( bile su uključene sinkronizacije pa tu nije trebao biti neki problem ).


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan