Ovu stranicu je najbolje pregledavati u modernom internet pregledniku s omogućenim JavaScriptom.

[PARPRO] 3. laboratorijska vježba - 2021/2022

MsBrightside

🤡 imas ti kakvu ideju?


Bucc

🤡

MsBrightside

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

bb99

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


« Prethodna stranica Sljedeća stranica »