Python modul PyCUDA -- paralelna redukcija, norma i skalarno množenje vektora - GASERI


Python modul PyCUDA: paralelna redukcija, norma i skalarno množenje vektora - Paralelna redukcija korištenjem jednog bloka - Redukcija podrazumijeva dobivanje jedne vrijednosti iz velikog broja njih; tipični primjeri su: Dva intuitivna pris...



Onion Details



Page Clicks: 0

First Seen: 03/15/2024

Last Indexed: 09/18/2024

Domain Index Total: 397



Onion Content



Python modul PyCUDA: paralelna redukcija, norma i skalarno množenje vektora - Paralelna redukcija korištenjem jednog bloka - Redukcija podrazumijeva dobivanje jedne vrijednosti iz velikog broja njih; tipični primjeri su: Dva intuitivna pristupa nameću se sami po sebi: Paralelna redukcija zahtijeva korištenje dijeljene memorije za razmjenu informacija između procesnih niti unutar jednog bloka. Grupa procesnih niti koje koriste dijeljenu memoriju se naziva Cooperative Thread Array (kraće CTA). Dijeljena memorija alocira se unutar zrna korištenjem ključne riječi __shared__ . Svakom bloku pridružuje se dana količina dijeljene memorije, koja je dostupna za čitanje i pisanje od strane svih procesnih niti unutar bloka. Kada procesna nit treba pročitati podatke zapisane od strane neke druge procesne niti unutar istog bloka, mora osigurati da je zapisivanje završilo. To se rješava čekanjem na ostale procesne niti korištenjem __syncthreads() naredbe. (Dakle, ne koriste se zaključavanja varijabli.) - Polja u dijeljenoj memoriji mogu se deklarirati statički u zrnu (veličina se definira u trenutku prevođenja programa) ili dinamički (veličina se definira kod poziva). Primjer statičke alokacije (dinamičku alokaciju demonstriramo kasnije): Redukcija je sama po sebi paralelan proces. Da bi ga paralelizirali za izvođenje na heterogenim sustavima, vršimo dekompoziciju na veći broj nezavisnih, paralelnih mini-redukcija. U dijeljenoj memoriji, kada primjerice tražimo minimalnu vrijednost u polju, to se čini korištenjem petlje oblika: U svakom koraku prepolavljamo broj aktivnih procesnih niti, i to tako da svaka aktivna procesna nit uspoređuje svoju vrijednost s pripadnom vrijednosti u drugoj polovici dijeljene memorije - Primjer; zrno koje radi redukciju je oblika - Ostatak koda je oblika - Zadatak - Informacije o korištenoj memoriji možemo dobiti pozivom ovako definirane funkcije kenrnel_meminfo() - Primjer dinamičke alokacije - Promijenite kod primjera koji traži minimalnu vrijednost u vektoru da koristi dinamičku umjesto statičke alokacije. Note - Zbog određenih problema na koje smo naišli prilikom korištenja dinamičke alokacije dijeljene memorije odavde nadalje koristit ćemo statičku alokaciju. Paralelna redukcija korištenjem više od jednog bloka - Svaki blok može zbog toga reducirati onoliko elemenata u dijeljenoj memoriji koliko ima procesnih niti u tom bloku na jedan element. Kod učitavanja iz globalne u dijeljenu memoriju, moguće je napraviti inicijalnu redukciju time što svaka procesna nit može učitati više od jedne vrijednosti iz globalne memorije, i sprema u dijeljenu memoriju samo krajnji rezultat. Primjerice, kod - omogućuje proizvoljan broj blokova, i oni će pročitati koliko god elemenata iz globalne memorije je potrebno da se popuni čitavo polje. To znači da pokretanje jednog zrna može izvesti čitavu redukciju polja; međutim, to nije efikacsno jer se većina procesnih resursa uređaja ne koristi. Zrno koje pokrećemo slično je kao i ranije, jedino što sada brine i o indeksu niti unutar bloka. Najefikasniji od svih pristupa pokreće dva zrna, jednu s brojem blokova dovoljnim da zasiti hardver, a drugu s jednim blokom koji "završava" redukciju. Izračun norme i skalarnog produkta vektora - Neka su \(a = (a_1, a_2, \ldots, a_n)\) i \(b = (b_1, b_2, \ldots, b_n)\) dva vektora. Skalarni produkt vektora \(a\) i \(b\) je suma oblika - Norma vektora \(a\) je korijen iz skalarnog produkta vektora sa samim sobom, odnosno - Python kod za normu vektora je oblika - Zrno je oblika - Todo - Ovdje nedostaje zadatak. Python kod za skalarni produkt je oblika - Author: Vedran Miletić