[PARPRO] 3. laboratorijska vježba - 2021/2022
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()
MsBrightside
Bica koje si vrijednosti stavija
bb99
Olive Oil Kolega razlikuju nam se greske za 10 iteracija, a sad je pitanje tko je pogrijesio kod prepisivanja
Tvoje:
Moje:
Stavio sam i 1000 iteracija nek se vrti, to ce biti gotovo za koja 2h pa cu usporediti sa greskom koju su nam dali
Jaster111
Jel itko skužio di i šta paralelizirat u 3. zadatku? Jel bi trebali sve ove 2d funkcije paralelizirat?
Bucc
Jaster111 možeš sve petlje paralelizirat, osim one za iterracije, to nisam dirao
for(i=gid; i < m; i+=threads){
for(j=0; j < n; j++){
}
}
svaki thread će imat još svoju petlju, drugačiji način ne znam, ali i to znatno ubrza. za python pogotovo meni je i do 25 puta brži s 64 dretve neg s jednom
Edrudo
Jel itko rjesavao ovaj labos na linuxu da mi moze pomoc, ocajan sam.
Edrudo
Edrudo
Kako to biva, cim pitas nades rjesenje.
nakon kaj se instaliraju driveri i skine sdk s materijala kod se kompelira ovom naredbom:
g++ -I/SDK/OpenCL/include -o app kostur++.cpp -lOpenCL
gdje je /SDK put do direktorija gdje je SDK raspakiran, tj. tamo gdje se nalazi OpenCL folder
MsBrightside
Olive Oil je li paraleliziras i pisanje temp-a u psi?
Bucc
MsBrightside da, sve dvostruke petlje i one 4 na početku. te četiri sam složio da svaka dretva ima svoju petlju, nisam slagao da ima više
DankJakov
Moze li mi netko pomoci, znaci kada unutar C funkcije isprintam C(i) dobijem dobru vrijednost, no nakon sto se napravi ovaj enqueue_copy koji bi trebao kopirati rezultat nazad u h_C, h_C sadrži potpuno drugacije brojeve (smeca od brojeva)
Bucc
DnkCkv probaj umjesto (N, N) stavit samo (N,) u glavnom programu, a u kernelu, ak ono prijašnje ne popravi, __global float* C, meni je nekad s double znalo zezat
zmaj
DnkCkv
Evo mučila sam se dva sata s tim, na kraju sam inicijalizirala polje h_C na int, što se više sumira u kernelu, bit će manja greška
MsBrightside
Olive Oil koliko kernela imas?
Bucc
MsBrightside za prva četiri fora je jedan, i po jedan kernel za svaku dvostruku petlju
MsBrightside
Olive Oil jesu svi kernel programi sa istim kontekstom
Bucc
bb99 damn, ma sam zaokruži na 5 decimala i dobar je. moguće da sam u nekoj petlji krivi raspon stavio
strole55
U mene puno manje traje
---
bb99 jesi usporedio mozda?
Bucc
MsBrightside jesu, i svi kerneli su mi u jednoj .cl datoteci
DankJakov
Olive Oil Stari moj borim se vec sat ipo, ovo sa float je proradilo, svaka cast 🙌🏿
---
Jel i vama drugi zadatak ultrabrz neovisno o N? Odnosno skroz malo se usporava ali sve je tipa 0.0002s