Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
GCOX Forumaš(ica)
Pridružen/a: 24. 10. 2006. (12:43:03) Postovi: (A8)16
Spol:
Lokacija: SPLIT_ZAGREB
|
|
[Vrh] |
|
Gino Forumaš(ica)
Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
GCOX Forumaš(ica)
Pridružen/a: 24. 10. 2006. (12:43:03) Postovi: (A8)16
Spol:
Lokacija: SPLIT_ZAGREB
|
Postano: 11:58 sub, 24. 3. 2012 Naslov: |
|
|
[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] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 16:18 sub, 24. 3. 2012 Naslov: |
|
|
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] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
Postano: 16:39 čet, 28. 6. 2012 Naslov: |
|
|
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] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 17:29 čet, 28. 6. 2012 Naslov: |
|
|
@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] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
|
[Vrh] |
|
|