[PARPRO] 3. laboratorijska vježba - 2021/2022
Reznox
[obrisani korisnik] Mozda imas gresku u dimenzijama koje saljes/koristis unutar kernela
MsBrightside
meni je greska u trecem cijelo vrijeme 0, jel ima jos netko da mu se to dogada
Daeyarn
MsBrightside jel imas postavljeno checkerr na 1?
__builtin_popcount
MsBrightside
Meni se događalo kad bih slučajno staro stanje pregazio novim (ili obrnuto), pa bih u funkciju za izračun greške i pod staro, i pod novo stanje poslao iste podatke.
Rope
MsBrightside Meni isto, pokusavam paralelizirati jacobistep i vec nakon dvije iteracije greska je 0. Jesi mozda uspjela skuzit u cem je stvar?
gladiator
kako generirati random broj u opencl-u?
SuperSaiyano
gladiator https://github.com/bstatcomp/RandomCL imaš ovdje kod koji mozes iskoristiti. Ja sam doslovno copy paste jednu od inacica, čak ima i primjer sa računanjem broja pi.
MsBrightside
Daeyarn ma probala sam i sa chekerrom i sa bez, izgleda da mi u jacobi kernelu sve budu 0 umjesto vrijednosti
MsBrightside
std::popcount a ne bi trebalo bit do toga jer nikad ne mijenjam oba prije racunanja greske
MsBrightside
MsBrightside
Kod kreiranja buffera koje mem_flags koristite
__builtin_popcount
SuperSaiyano
Za što vama trebaju slučajni brojevi, zar ne trebamo ovo paralelizirati (piše “tekst programa na kraju poglavlja 2. MPI u skripti”):
SuperSaiyano
std::popcount Da u pravu si, nisam ni čitao i pomislio na drugi algoritam sa nasumičnim brojevima. “ali također trivijalno paralelan”, možda jeste veća točnost rješenja ali sam nešto uradio, neće mi valjda sad ne priznati zadatak.
Jaster111
Ne kužim, meni već negdje oko 10. iteracije bude error otprilike kao i u njihovom primjeru nakon 1000 i onda se samo nastavi smanjivat prema nuli… jel se netko suočio s tim i neki help?
---
kako osigurati da kernel radi i ako je N < G ?
Jaster111
🤡 to i mene zanima pls help ppl
ZalutaliStudent
🤡 Ja bi radije osigurao da uvijek N bude veci od G. Cini se jednostavnije nego osiguravat da kernel radi za N < G.
Svudec
🤡 šalješ kernelu parametar N iz hosta i onda u kernelu staviš if njegov globalni index < N računa, inače samo return.
To ti rješava i da N mora bit djeljiv sa G. Znači dio threadova neće raditi ništa, al nema drugog načina
---
također zad1 “potrebno je odrediti optimalne parametre G i L koji daju najbrže izvođenje”
koji bi to bili parametri?
ZalutaliStudent
🤡 Ja sam testirao s razno raznim parametrima, i zapisao rezultate. Nasao sam optimalno od tih mojih testiranih (za 2 na 21, dakle 2 milijuna podataka) zadatak mi se izvrsi za 50ak sekundi i pronade 155 613 prostih brojeva. Ako se stavi G=a_np.shape, a L=None onda traje 80ak sekundi. Znaci uspio sam ga malo smanjiti. Moji optimalni parametri su G=(N/local_size)*6, a local_size je local_size = prg.prim.get_work_group_info(cl.kernel_work_group_info.WORK_GROUP_SIZE, device)
MIslim da je poanta samo se poigrat s G i L da vidis kak funkcioniraju, ne trebas sad stvarno nac najoptimalnije i najbrze izvodenje moguce.
Svudec
🤡 Ja sam pronašao da je za moj procesor u dokumentaciji najbolji L=64 jer procesor ima fizički 16 threads, naredbe se izvode u 4 koraka i onda je to efektivno 64 threads istovremeno.
I onda staviš G takav da uvijek bude djeljiv sa L i što veći (isprobavaj samo potencije broja 2).
Npr meni je za prvi N= 2 na 25, G= 2 na 19, L=64 i to se izračuna za cca 3.8 sekunde