Se dă următorul calcul cu matrice:
C = At * B
D = C * Ct
y = init_vector(N, 0)
i = 0
while (i < N) {
y += D * linie(C, i)
i += 1
}
y = y + x
unde:
Se dorește implementarea expresiei de mai sus folosind limbajul C, în 3 moduri:
Pentru testarea temei vă este oferit un schelet de cod pe care trebuie să-l completați cu implementările celor 3 variante menționate mai sus. Scheletul de cod este structurat astfel:
În urma rulării comenzii make vor rezulta 3 fișere binare, tema1_blas, tema1_neopt și tema1_opt_m corespunzătoare celor 3 variante care trebuie implementate.
./tema1_<mod> input
unde:
Fișierul input este structurat astfel:
Rularea se va face pe partiția haswell folosind sbatch sau srun.
Pentru a avea acces la biblioteca openblas care este folosita la compilarea variantei blas veti rula in interiorul unui container folosind comanda apptainer.
Containerul il puteti descarca de aici: optimizari.sif
Pentru a deschide un shell in interiorul containerului veti folosi:
[vlad.spoiala@haswell-wn29 ~]$ apptainer shell optimizari.sif [Apptainer] vlad.spoiala:~ $
Pentru a rula un script in interiorul containerului veti folosi:
[vlad.spoiala@haswell-wn29 ~]$ apptainer exec optimizari.sif bash test.sh
Pentru a vedea cat de incarcate sunt nodurile puteti folosi scontrol:
[vlad.spoiala@fep8 sol]$ for node in haswell-wn{29..40}; do echo -n $node; scontrol show node $node | grep CPU; done
haswell-wn29 CPUAlloc=20 CPUTot=32 CPULoad=13.62
haswell-wn30 CPUAlloc=18 CPUTot=32 CPULoad=4.19
haswell-wn31 CPUAlloc=18 CPUTot=32 CPULoad=3.76
haswell-wn32 CPUAlloc=18 CPUTot=32 CPULoad=3.79
haswell-wn33 CPUAlloc=18 CPUTot=32 CPULoad=3.76
haswell-wn34 CPUAlloc=18 CPUTot=32 CPULoad=3.79
haswell-wn35 CPUAlloc=18 CPUTot=32 CPULoad=3.75
haswell-wn36 CPUAlloc=18 CPUTot=32 CPULoad=3.88
haswell-wn37 CPUAlloc=18 CPUTot=32 CPULoad=3.76
haswell-wn38 CPUAlloc=18 CPUTot=32 CPULoad=3.87
haswell-wn39 CPUAlloc=18 CPUTot=32 CPULoad=3.95
haswell-wn40 CPUAlloc=18 CPUTot=32 CPULoad=3.47
Pentru a evita rularea pe nodurile incarcate puteti folosi optiunea –exclude din sbatch sau srun.
De exemplu, pentru a nu rula pe nodurile 29 si 30 putem folosi sbatch in felul urmator:
[vlad.spoiala@fep8 sol]$ sbatch -p haswell --time 00:03:00 --exclude=haswell-wn[29-30] test_all_opt.sh Submitted batch job 471560
Jobul ruleaza pe haswell-wn31:
[vlad.spoiala@fep8 sol]$ squeue -u vlad.spoiala
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
471560 haswell test_all vlad.spo R 0:06 1 haswell-wn31
Folosirea –exclude pentru srun este similara:
[vlad.spoiala@fep10 ~]$ srun -p haswell --exclude=haswell-wn[29-30] --pty bash [vlad.spoiala@haswell-wn31 ~]$
Fisierul input contine 3 teste:
3 400 123 out1 800 456 out2 1200 789 out3
În cazul fișierului input avem 3 teste pentru urmatoarele valori ale lui N: 400, 800, respectiv 1200. Seed-urile folosite la generarea datelor de intrare sunt 123, 456, respectiv 789. Fișierele de output sunt out1, out2, respectiv out3.
Fișierul input_valgrind ce va fi folosit pentru rulările de valgrind contine un singur test:
1 400 123 out1
Punctajul este impărțit astfel: Parte verificata / notata automat de checker (max 100p == 1 punct de nota finala):
Parte verificata / notata la interviul/evaluarea individuala de laborator/teme de la finalul semestrului. Punctajul de mai jos este doar pentru tema 1 si poate atinge max 50p == 0.5p din nota finala:
Depunctări posibile:
Arhiva temei va fi încărcată pe Moodle.
Structura arhivei va fi următoarea:
src solver_blas.c solver_neopt.c solver_opt.c ... cache blas.cache neopt.cache opt_m.cache memory opt_m.memory neopt.memory blas.memory README LLMprompts grafice ...
La încărcarea pe Moodle vor fi verificate următoarele:
Celelalte aspecte ale temei (README, LLMprompts, grafice) vor fi verificate ulterior.
squeue
pentru a vedea câte job-uri aveți pornite, și apoi să utilizați comanda
scancel <job_id>
pentru a opri un job.
Orice întrebare e recomandat să conțină o descriere cât mai clară a eventualei probleme. Întrebări de forma: “Nu merge X. De ce?” fără o descriere mai amănunțită vor primi un răspuns mai greu.
ATENȚIE să nu postați imagini cu părți din soluția voastră pe forumul pus la dispoziție sau orice alt canal public de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.
Pentru a clona repo-ul și a accesa resursele temei 1:
student@asc:~$ git clone https://gitlab.cs.pub.ro/asc/asc-public.git student@asc:~$ cd asc-public/assignments/1-optimizari
Pentru a valida corectitudinea rezultatelor puteti folosi fisierele output referinta din directorul references.