Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
mhaberl Forumaš(ica)
Pridružen/a: 05. 09. 2009. (14:44:26) Postovi: (2D)16
Spol:
Sarma: -
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 21:16 uto, 27. 3. 2012 Naslov: |
|
|
Bilo je pitanje čemu služi i je li potreban cudaDeviceSynchronize() na kraju fro.cu primjera.
Odgovor:
Moramo pričekati da se kernel izvrši kako bi pročitali rezultat iz varijable.
Time što je poziv cublas funkcije završio ne mora značiti da je i kernel kojeg ona zove gotov.
U CUBLAS_Library.pdf, sekcija 2.4 Scalar Parameters, stoji da trebamo "proper synchronization" prije čitanja rezultata.
To je objašnjenje dodano u novu verziju fro.cu primjera na Webu.
Također, nisam siguran jesam li vam (korektno) rekao kako se prevodi višedimenzionalni threadIdx u linearni indeks threada unutar bloka.
Iz linearnog indeksa možemo zaključiti kojem warpu thread pripada i koji mu je lokalni indeks unutar tog warpa).
Zamislite to kao pretvaranje iz kordinata u kartezijskom MPI komunikatoru u linearni rank (0..broj_procesa_u_commu), s jednom razlikom:
[color=red]pretvorba [b]nije[/b] C-ovska (row-major), već column-major (kao u Fortranu)[/color].
Točnu formulu imate u CUDA_C_Programming_Guide.pdf, sekcija 2.2 Thread Hierarchy.
Kako je to [i]vrlo važno[/i] za pisanje korektnog i brzog koda, molim da svakako pogledate.
Barem 2 razloga: priča o pravilnom pristupu memoriji podrazumijeva linearne indekse threadova.
Također, bilo kakav algoritam na warp razini krucijalno ovisi o tome koji threadovi se nalaze skupa u warpu.
Bilo je pitanje čemu služi i je li potreban cudaDeviceSynchronize() na kraju fro.cu primjera.
Odgovor:
Moramo pričekati da se kernel izvrši kako bi pročitali rezultat iz varijable.
Time što je poziv cublas funkcije završio ne mora značiti da je i kernel kojeg ona zove gotov.
U CUBLAS_Library.pdf, sekcija 2.4 Scalar Parameters, stoji da trebamo "proper synchronization" prije čitanja rezultata.
To je objašnjenje dodano u novu verziju fro.cu primjera na Webu.
Također, nisam siguran jesam li vam (korektno) rekao kako se prevodi višedimenzionalni threadIdx u linearni indeks threada unutar bloka.
Iz linearnog indeksa možemo zaključiti kojem warpu thread pripada i koji mu je lokalni indeks unutar tog warpa).
Zamislite to kao pretvaranje iz kordinata u kartezijskom MPI komunikatoru u linearni rank (0..broj_procesa_u_commu), s jednom razlikom:
pretvorba nije C-ovska (row-major), već column-major (kao u Fortranu).
Točnu formulu imate u CUDA_C_Programming_Guide.pdf, sekcija 2.2 Thread Hierarchy.
Kako je to vrlo važno za pisanje korektnog i brzog koda, molim da svakako pogledate.
Barem 2 razloga: priča o pravilnom pristupu memoriji podrazumijeva linearne indekse threadova.
Također, bilo kakav algoritam na warp razini krucijalno ovisi o tome koji threadovi se nalaze skupa u warpu.
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 3:23 pet, 6. 4. 2012 Naslov: |
|
|
Ako želite detaljnije pogledati koji dijelovi vašeg grafičkog koda jedu koliko resursa, to možete CUDA Profiler-om.
Kako na Fermiju nećete lako pokrenuti GUI aplikaciju, pa tako ni [url=http://developer.nvidia.com/nvidia-visual-profiler]CUDA Visual Profiler[/url] (nvpp), preporučam "nevidljivi" ali vrlo korisni komandnolinijski profiler.
Više o njemu [url=http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/Compute_Command_Line_Profiler_User_Guide.pdf]ovdje[/url]. Ukratko: postavite jedan fajl i ponešto environment varijabli.
Podsjetnik: varijable postavljate npr. ovako
[tt]export COMPUTE_PROFILE=1[/tt]
Preporučam uključiti CSV output.
Rezultate onda možete analizirati Open (ili Libre) Office Calc-om, Excel-om, ...
Jedina je nevolja ako imate zbilja velik output (više od 1Mi redaka), jer to spreadsheet aplikacije ne vole.
No, to se neće dogoditi za jednostavne primjene.
:OT:
Ako netko zna spreadsheet aplikaciju koja je free, guta CSV i pokoje milionče redaka joj ne predstavlja problem, bit ću vrlo zahvalan (kava...).
Ne tražim "rješenja" tipa [i]promijeni ove konstante u source kodu ogromatičnog office paketa i rekompajliraj ga[/i] jer za to zbilja nemam vremena.
Ako želite detaljnije pogledati koji dijelovi vašeg grafičkog koda jedu koliko resursa, to možete CUDA Profiler-om.
Kako na Fermiju nećete lako pokrenuti GUI aplikaciju, pa tako ni CUDA Visual Profiler (nvpp), preporučam "nevidljivi" ali vrlo korisni komandnolinijski profiler.
Više o njemu ovdje. Ukratko: postavite jedan fajl i ponešto environment varijabli.
Podsjetnik: varijable postavljate npr. ovako
export COMPUTE_PROFILE=1
Preporučam uključiti CSV output.
Rezultate onda možete analizirati Open (ili Libre) Office Calc-om, Excel-om, ...
Jedina je nevolja ako imate zbilja velik output (više od 1Mi redaka), jer to spreadsheet aplikacije ne vole.
No, to se neće dogoditi za jednostavne primjene.
Ako netko zna spreadsheet aplikaciju koja je free, guta CSV i pokoje milionče redaka joj ne predstavlja problem, bit ću vrlo zahvalan (kava...).
Ne tražim "rješenja" tipa promijeni ove konstante u source kodu ogromatičnog office paketa i rekompajliraj ga jer za to zbilja nemam vremena.
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
|