[PARPRO] 3. laboratorijska vježba - 2021/2022
Retard00
Pseudokod za jacobija može biti ovakav:
kernel void jacobi_step(psi, psinew, m, n, threadcount, psi_size):
id = get_global_id(0)
repeats = (int)ceil((float)(m * n) / threadcount)
for (int iter = 0; iter < repeats; iter++)
number = id + iter * thread_count
if (number >= psi_size)
break
i = (number % m) + 1
j = ((number / m) % n) + 1
psinew[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])
return
Za buffere se može stavit CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR
radi jednostavnosti i veličinu (m+2) * (n+2) * sizeof(double) za varijable psi i psitmp.
Smolaa
Retard00 Hvala !
Fikalo
Polifem E kak si uspio to napravit, ja imam CL_MEM_USE_HOST_PTR u bufferu iz kojeg citam, ali ako ga ne refresham pri svakom loopu mi error postaje 0.
Polifem
Fikalo
Prije petlje za iteraciju postavljam buffere i kernel.setArgs i sve ono za CL, onda u petlji za iteraciju pozivam
queue.enqueueNDRangeKernel , finish , i enqueueReadBuffer koji znaci obavlja jacobi, a nakon toga se vrti sve ono iz cfd sto je ispod jacobi.
tempest
Peter Jordanson
Nisam više siguran dal je to ta greška jer se ne sjećam koji je točno ispis greške meni bio, ali provjeri dal u cudaMalloc()
i cudaMemcpy()
stavljaš točnu veličinu, za Psi bi trebala biti (m + 2) * (n + 2) * sizeof(double)
neksi
Polifem meni je uvik greska 0 ovako
Polifem
filip
nez, paralelno si napravio samo jacobi ili i copy_back ? jer npr. ako probam i copy back paralelno onda mi je greska kriva a nez zašto jer bi trebala bit ista stvar. tako da radim samo jacobi paralelno s CL_MEM_USE_HOST_PTR i to mi funkcionira, smanji mi za 10 sek izvođenje.
neksi
Polifem radia sam samo jacobi, jesi koristia samo CL_MEM_USE_HOST_PTR ili još neke druge zastave?
JoKing
Polifem Imao sam sličan problem, kad napravim svoju verziju copy dobijem nekoliko puta manju grešku, i na kraju skužim da sam ja kopirao čitavu listu, a i u copy treba staviti ogradu da se ne kopiraju rubni elementi “matrice”, kao i za računanje jacobia i onda dobivam točno rješenje pa provjeri i ti imaš li istu situaciju
Polifem
filip
Buffer A = Buffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, (m + 2) * (n + 2) * sizeof(double), &psi[0]);
Samo ovo
Fikalo
Polifem i ja imam tako, al ak ne napravim to opet u svakoj petlji mi i dalje bude error 0
TheCrimsonChin
Je li netko tko je radio u cudi uspio napravit atomicAdd za double vrijednosti?
JoKing
TheCrimsonChin Nisam radio u cudi pa ne mogu reći, ali jesi probao ovo
TheCrimsonChin
JoKing da, funkcionira za integere, ali neće mi se kompajlirat ako zbrajam doublove
tempest
Ja sam prvo probao kopirati kod za double atomicAdd s linka JoKing, isto mi nije htjelo funkcionirati pa sam funkciju preimenovao u atomicAdd_double, ali onda mi je izvođenje trajalo duže nego serijski.
Na kraju sam uspio tako da sam definirao unsigned long long int varijablu za npr. Pi, koja ce se slati u kernel funkciju i nad kojom ce se izvodit atomicAdd. U kernel funkciji sam onda kalkulacije napravio koristeći double varijable i prije dodavanja u atomicAdd rezultat pomnozio sa 10 na veliku potenciju i castao u unsigned long long int. I na kraju nakon povratka rezultata castao ga u double i podijelio.
BK-
Kod mi samo vrati exited with code -1073741676. Nešto je do openCL -a. Iz kostrur++.cpp sam kopirao stvari za pokretanje kernel programa i imam jednostavnu kernel funkciju koja računa jednu iteraciju psinew. Ne dobiva errore da mi ne valja dimenzija ili nesto slicno. Ima li netko ideju sto bi moglo bit krivo?
AK10
jel mogu proc labos ako imam kod za 3. koji ne radi al eto imam nesto napisano, a prva 2 mi rade dobro?
Bisolvon
endyyyy Mene su prvo pitali dali sam napravio treci, koliko sam shvatio ne prihvacaju predaju ako nemas treci.
TheCrimsonChin
endyyyy kad sam bio na predaji drugog labosa čuo sam da asistentica nekom liku govori nešto tipa “bitno mi je da ste svaki zadatak pokušali riješit, a sad je li funkcionira…”
TheCrimsonChin
tempest Zanimljivo rješenje. Ja sam našo nečiji repozitorij gdje je nteko implementiro za sve ove tipove što fale pa sam to kopirao. Da znam tko je, častio bih ga
huhu
Ima li netko neki konstruktivan hint za 3. zadatak ako se radi u pythonu s OpenCL (tipa da napise neke korake kako imati nesto, ne mora raditi cisto da mogu predat)?
SuperSjajan3
huhu Prepisi njihov kod iz c++ u python i samo paraleliziraj n2 for petlje. Znaci onaj jacobistep, dsquare i copy. Zapravo nije komplicirano, najvise ti je drkanja s tipovima podataka, svi su imali probleme da im je error 0 zbog neke gluposti. Scrollaj gore malo, vjerojatno ces nac sve sta ce te zanimat