Table of Contents

Tema 1

  • Deadline soft: 26 Aprilie 2026, ora 23:55.
  • Primiți un bonus de 10% din punctajul obținut pentru trimiterea temei înainte de 24 Aprilie 2026, ora 23:55. Veți primi o depunctare de 10% din punctajul maxim al temei pentru fiecare zi de întârziere, până la maxim 7 zile, adică până pe 3 Mai 2026, ora 23:55.
  • Deadline hard: 3 Mai 2026, ora 23:55.

  • Dată publicare: 9 aprilie 2026
  • Dată actualizare enunț:

Enunț

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:

Toate cele 3 implementari vor tine cont ca D este o matrice simetrica.

Rulare și testare

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:

Puteți aduce orice modificare scheletului de cod exceptând fișierele menționate mai sus.

Î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.

Rularea se va realiza astfel:

./tema1_<mod> input 

unde:

  • mod este unul din modurile blas, neopt, opt_m
  • input este fișierul ce contine descrierea testelor.

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

Comanda apptainer trebuie rulata de pe unul din nodurile partitiei haswell, nu de pe fep.

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 ~]$ 

Testele voastre de performanță trebuie realizate pe partiția haswell deoarece evaluarea temelor se va face pe această partiție.

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.

Pentru a fi luată în considerare la punctaj, implementarea trebuie să producă rezultate corecte pe toate cele 3 teste din fișierul input.

Fișierul input_valgrind ce va fi folosit pentru rulările de valgrind contine un singur test:

1
400 123 out1

Punctaj

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:

Precizări încărcare / Moodle

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.

Precizări și recomandări

Punctajul maxim obtinut de tester este 100p. Cele 50p descrise pentru partea de documentatie (README, cod, grafice, prompturi etc.) vor fi evaluate si notate in cadrul interviului de laborator, impreuna cu explicatiile temei 2.

Pentru a evita aglomerarea cozii se recomandă rularea de teste pentru valori ale lui N mai mici sau egale cu 1200.

Se recomandă ștergerea fișierelor coredump în cazul rulărilor care se termină cu eroare pentru a evita problemele cu spațiul de stocare.

În cazul în care job-urile vă rămân “agățate”, va recomandam să utilizați de pe fep.grid.pub.ro, comanda

 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.

TODO Pentru întrebări sau nelămuriri legate de temă folosiți forumul temei.

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ă.

Temele vor fi testate împotriva plagiatului, atat partea de cod cat si cea de prompturi LLM. Orice tentativă de copiere va fi depunctată conform regulamentului. Rezultatele notării automate este orientativă și poate fi afectată de corectarea manuală, de detaliile oferite in readme si respectiv de succesiunea de prompturi oferite so a motivelor pentru care ati ales sa folositi aceaste prompturi (este recomandat sa face acest lucru in readme).

Resurse necesare realizării temei

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.

Ghid pentru folosirea gridului instituțional

Ghid pentru folosirea apptainer pe cluster