Se dă următoarea operație cu matrice:
$$ C = (A^t \times B + B \times A) \times B^t $$
unde:
Se dorește implementarea expresiei de mai sus folosind limbajele C/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, tema3_blas, tema3_neopt și tema3_opt_m corespunzătoare celor 3 variante care trebuie implementate.
./tema3_<mod> input
unde:
Fișierul input este structurat astfel:
Rularea se va face pe partiția haswell folosind sbatch. Compilarea se va face folosind gcc-8.5.0.
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. 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
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:
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 grafice ...
La încărcarea pe Moodle vor fi verificate următoarele:
Celelalte aspecte ale temei (README, 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 3:
student@asc:~$ git clone https://gitlab.cs.pub.ro/asc/asc-public.git student@asc:~$ cd asc-public/assignments/3-optimizari
Pentru a valida corectitudinea rezultatelor puteti folosi fisierele output referinta din directorul references.