Onion Information
Python modul PyCUDA -- paralelni algoritmi na matricama - GASERI
Python modul PyCUDA: paralelni algoritmi na matricama - Rad s višedimenzionalnim poljima. Zbrajanje matrica - Intuitivni pristup zbrajanju matrica bio bi oblika - međutim, on ovdje ne daje dobar rezultat. Kod, ako uopće radi, nije optimalan...
Onion Details
Page Clicks: 1
First Seen: 03/15/2024
Last Indexed: 09/18/2024
Onion Content
Python modul PyCUDA: paralelni algoritmi na matricama - Rad s višedimenzionalnim poljima. Zbrajanje matrica - Intuitivni pristup zbrajanju matrica bio bi oblika - međutim, on ovdje ne daje dobar rezultat. Kod, ako uopće radi, nije optimalan zbog specifičnosti arhitekture GPU-a (očekuje vektor, ne višedimenzionalnu strukturu). Potrebno je napraviti tzv. serijalizaciju . C/C++ koristi Row-major order (Fortran koristi Column-major order ). uočimo da je blockDim.x broj procesnih niti po x koordinati, a blockDim.y broj procesnih niti po y koordinati - što je x, a što y, ostavljeno je programeru na volju , nije predefinirano - Zrno je oblika - Inicijalizacija matrica kao numpy polja je oblika - Izračun rezultata na GPU-u i CPU-u i usporedba rezultata izvodi se kodom - Zadatak - Prilagodite gornji kod tako da se zrnu prosljeđuje i veličina matrice koja se koristi u izračunu; za to trebate napraviti tri stvari: Napomena: veličinu matrice potrebno je znati kada broj niti koje rade na matrici nije identičan kao ta veličina. Primjerice, za zbroj matrica veličine (16, 16) koji izvodi 20 niti kod bi mogao biti oblika - Međutim, radi jednostavnosti i boljih performansi, preferira se usklađivanje veličine polja i broja niti koje rade na tom polju ukoliko je moguće napraviti na danom problemu. Napišite program koji na dvije matrice matrica formata 10 * 10 element po element radi operaciju: \(2 \cdot \sin(a) + 3 \cdot \cos(b) + 4\) - Ovu operaciju učinite device funkcijom i pozovite ju unutar zrna. Množenje matrice i vektora - Python kod je oblika - Naivno množenje matrica - Serijski kod za množenje matrica je oblika - Kao i kod zbrajanja, na GPU-u ćemo množenje matrica raditi s jednodimenzionalnim poljem. Ostatak program vrlo je sličan kao kod zbrajanja. Note - Kada se izvodi zrno koje radi sa višedimenzionalnim poljem i više blokova u svakoj od dimenzija: tada je indeks elementa suma: Prilagodite kod tako da množi matrice formata (200, 200) u 10 blokova po x koordinati i 10 blokova po y koordinati. Modificiriajte program koji vrši jednoblokovno modificirano množenje matrica tako da umjesto produkta gdje je je element \((i, j)\) oblika \(\sum_k a_{ik} \cdot b_{kj}\) , on bude oblika \(\sum_k 2 \cdot a_{ik}^{b_{kj}}\) . Druge primjene matrica - Računate prosječne vrijednosti temperature za određeno mjesto. Definirajte zrno koje prima tri argumenta, matricu tipa float , vektor tipa int i vektor tipa float . ( Uputa: napravite zrno koje se izvodi na 4 bloka i 16 niti po bloku; iskoristite dijeljenu memoriju unutar svakog bloka da bi redukcijom sumirali elemente; iz vektora tipa int očitajte koliko je elementa različitih od 0, i na temelju toga izračunajte prosječnu vrijednost.) - ( Primjer:: u slučaju kad bi imali tri mjesta i matricu od 5 stupaca, matrica može biti oblika: a pripadni vektor je tada oblika - Uočimo također da vrijednosti koje se ne uzimaju u obzir mogu biti proizvoljne i ne moraju nužno biti 0.) - Author: Vedran Miletić