Pitanje sa device pointerima
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Paralelni algoritmi 1 i 2

#1: Pitanje sa device pointerima Autor/ica: GCOXLokacija: SPLIT_ZAGREB PostPostano: 22:17 pet, 23. 3. 2012
    —
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?

#2:  Autor/ica: GinoLokacija: Pula PostPostano: 10:16 sub, 24. 3. 2012
    —
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...

#3:  Autor/ica: GCOXLokacija: SPLIT_ZAGREB PostPostano: 11:58 sub, 24. 3. 2012
    —
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)

#4:  Autor/ica: venovako PostPostano: 16:18 sub, 24. 3. 2012
    —
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.

#5:  Autor/ica: CobsLokacija: Geto PostPostano: 16:39 čet, 28. 6. 2012
    —
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...

#6:  Autor/ica: venovako PostPostano: 17:29 čet, 28. 6. 2012
    —
@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.

#7:  Autor/ica: CobsLokacija: Geto PostPostano: 17:55 čet, 28. 6. 2012
    —
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 ).



Forum@DeGiorgi -> Paralelni algoritmi 1 i 2


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin