[PARPRO] 3. laboratorijska vježba - 2021/2022
---
koliko vam traje slijedno u 2. zadatku?
madukali
Hoće li biti još jedna predaja jer vidim da je predviđena još jedna predaja na https://www.fer.unizg.hr/predmet/parpro/ispiti ,ali na ferku je LAB 5 samo ovaj tjedan
Spuk
madukali da to je i mene zbunilo. Razmisljam polako poslat mail profesoru.
miss_anthropocene
Spuk
https://www.fer.unizg.hr/predmet/parpro/obavijesti?@=2vxzv#news_24710
VAŽNO: Iznimno je u ovom tjednu predaje omogućena prijava i za predaju dodatne domaće zadaće u istom tjednu (izostanci zbog STEM games, bolesti i slično). Ukoliko želite predati dodatnu domaću zadaću, za dodatnu prijavu koristite burzu grupa pod nazivom Lab 5. Dodatna predaja (još jedne zadaće) moguća je samo uz prijavu na odgovarajuću burzu.
aerius
AE
Jel zna neko možda rješenje za ovo? hhahah
MrDREDD
Kako ste u drugom zadatku dodavali u globalnu memoriju? Koliko sam shvatio, ne postoji atomic_add za float vrijednosti…
Daeyarn
MrDREDD treba pohraniti sve vrijednosti u polje, i onda ce host kada iskopira polje iz gpu pozbrajati sve
gpu samo racuna clanove, ne zbraja ih
---
zna netko zasto mi u prvom polje koje posaljem na device postane sjebano? posaljem npr [1, 2, 3, 4….] nule na mjestima neparnih indeksa??
steker
moze neko pojasnit kako u prvom ostvarit da jedna dretva moze obradit vise elemenata niza, kako znamo od kojeg do kojeg indeksa niza treba ici?
Daeyarn
steker ja posaljem svim dretvama koliko elemenata treba obraditi(broj elemenata niza N mora biti visekratnik od broja dretvi G tako da svaka dobije jednak broj elemenata) i onda dretva moze na temelju toga i svog global id-a izracunati koje elemente obraduje
Bica
Koje ste G i L postavili u 3? Pokusao sam paralelizirati samo jacobistep tako da podijelim na workgroups i onda pomocu workgroup_id i local_id racunam psi, ali dobijem grešku zbog krivog G i L.
MsBrightside
Bica koje si vrijednosti stavija
Bucc
jedan kolega me zamolio da napravim kao neke natuknice za pyopencl. primjer programa koji obrađuje elemente s n dretvi malo je objašnjeno u comm.py koliko sam bio sposoban. dvije slike gdje sam izvrtio taj kod, pp.py i pp.cl da se može pokrenuti sa python pp.py. možda nekome pomogne
gladiator
Olive Oil god’s work kolega
Bucc
Olive Oil sad sam vidio da u comm.py u drugoj petlji size treba bit threads, krivo sam vidio. u pp.cl je dobro napisano
Jaster111
Reznox
MsBrightside ma slucajno san ostavia na float vrijednosti umisto int
aerius
jel rok za predaju onda sutra do 12 ili ponoći?
gladiator
ako vam pip install pyopencl prođe u prvom pokušaju, jeste li uopće živjeli?
aerius
btw jel ima ko ili je imo problema sa pokretanjem jakobovićevim opencl primjera sa amd-ovom grafičkom na windowsu?
---
Može netko podijeliti py kod za slijednu verziju CFD? Taj dio je ionako svima isti pa da uštedimo vrijeme 😃
MsBrightside
🤡 imas ti kakvu ideju?
Bucc
import numpy as np, math, time,sys
np.set_printoptions(threshold=sys.maxsize)
def main():
error, bnorm, tolerance, scalefactor, numiter, printfreq = 0, 0, 0, 0, 0, 1000
bbase, hbase, wbase, mbase, nbase = 10, 15, 5, 32, 32
irrotational, checkerr = 1, 0
m, n, b, h, w, iter, i, j = 0, 0, 0, 0, 0, 0, 0, 0
tstart, tstop, ttot, titer = 0, 0, 0, 0
print("Usage: cfd <scale> <numiter>\n")
scalefactor, numiter = 64, 1
print("Scale Factor = {}, iterations = {}\n".format(scalefactor, numiter))
b = bbase*scalefactor
h = hbase*scalefactor
w = wbase*scalefactor
m = mbase*scalefactor
n = nbase*scalefactor
print("Running CFD on {} x {} grid in serial\n".format(m,n))
psi = np.zeros(((m+2)*(n+2)), dtype=np.float32)
psitmp = np.zeros(((m+2)*(n+2)), dtype=np.float32)
i, j = 0, 0
for i in range(b+1, b+w):
psi[i*(m+2)+0] = i-b
for i in range(b+w, m+1):
psi[i*(m+2)+0] = w
for j in range(1, h+1):
psi[(m+1)*(m+2)+j] = w
for j in range(h+1, h+w):
psi[(m+1)*(m+2)+j]= w-j+h
bnorm=0.0
for i in range(0, m+2):
for j in range(0, n+2):
bnorm += psi[i*(m+2)+j]*psi[i*(m+2)+j]
bnorm=math.sqrt(bnorm)
print("\nStarting main loop...\n\n")
tstart=time.time()
for iter in range(1, numiter+1):
for i in range(1, m+1):
for j in range(1, n+1):
psitmp[i*(m+2)+j]=0.25*(psi[(i-1)*(m+2)+j]+psi[(i+1)*(m+2)+j]+psi[i*(m+2)+j-1]+psi[i*(m+2)+j+1])
if checkerr or iter == numiter:
dsq = 0
for i in range(1, m+1):
for j in range(1, n+1):
tmp = psitmp[i*(m+2)+j]-psi[i*(m+2)+j]
dsq += tmp*tmp
error = dsq
error=math.sqrt(error)
error=error/bnorm
if checkerr:
if (error < tolerance):
print("Converged on iteration {}\n".format(iter))
break
for i in range(1, m+1):
for j in range(1, n+1):
psi[i*(m+2)+j]=psitmp[i*(m+2)+j]
if(iter%printfreq == 0):
if not checkerr:
print("Completed iteration {}\n".format(iter))
else:
print("Completed iteration {}, error = {}\n".format(iter,error))
if iter > numiter:
iter=numiter
tstop=time.time()
ttot=tstop-tstart
titer=ttot/iter
print("\n... finished\n")
print("After {} iterations, the error is {}\n".format(iter,error))
print("Time for {} iterations was {} seconds\n".format(iter,ttot))
print("Each iteration took {} seconds\n".format(titer))
print("... finished\n")
if __name__ == '__main__':
main()