Sunteți pe pagina 1din 2

UNIVERITATEA DE STAT DIN MOLDOVA

Facultatea de Matematică și Informatică


Departamentul de Matematică
APROB
5 decembrie 2022

Director Departament
B. Hincu, dr. conf. univ.
TEST 1
pentru examenul scris la disciplina Programare paralelă
Anul IV Licență, Specialitatea Informatica aplicata frecventa redusa
Durata examenului: 3 ore academice
1. Sisteme paralele de calcul cu memorie distribuita (DMM) si partajata (SMM).
1.1. Reprezentați schemele grafice ale sistemelor cu memorie distribuita si partajata. [2 puncte].
1.2. Descrieți principalele particularităţi în elaborarea programelor pentru sisteme paralele de calcul cu memorie distribuita si
partajata. [3 puncte].
2. Secvente critice si excluderea reciproca a proceselor
2.1. Daţi exemplu (in limbajul C++) de secvenţă critică şi argumentaţi răspunsul. [2.5 puncte].
2.2. Descrieţi regulile de excludere reciprocă a proceselor la executarea secvenţelor critice [2.5 puncte].
1
3. Algoritmul paralel pentru determinarea  =  4
dx .
0 1+ x
2

3.1. Descrieţi algoritmul paralel. [5 puncte].


3.2. Descrieţi funcţiile MPI şi explicaţi parametrii lor pentru realizarea paralelizării la nivel de date în cazul comunicărilor unu-
direcţionate. [5 puncte].
3.3. Descrieţi funcţiile MPI şi explicaţi parametrii lor pentru realizarea paralelizării la nivel de operaţii în cazul comunicărilor
unu-direcţionate. [5 puncte].
4. Fie dat următorul program
#include <omp.h> #pragma omp parallel reduction(+:c)
#include "mpi.h" {
#define _NUM_THREADS 2 c = 1;
int main (int argc, char *argv[]) }
{ MPI_Reduce(&c, &Sum_c, 1, MPI_INT, MPI_SUM, 0,
int my_rank; MPI_COMM_WORLD);
omp_set_num_threads(_NUM_THREADS); if (my_rank == 0) printf("Total number =%d \n",Sum_c);
MPI_Init(&argc, &argv); MPI_Finalize();
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); return 0;
int c, Sum_c; }
4.1. Explicați ce calculează acest program şi ce rezultate vor fi afișate daca se execută pe 2 sau 5 procesoare [5
puncte].
4.2. Descrieţi funcțiile MPI, directivele OpenMP utilizate in acest program şi explicaţi parametrii lor. [5 puncte].
4.3. Fie că programul se execută pe 5 procesoare. Indicaţi ce schimbări sunt necesare pentru ca instrucţiunea de
atribuire ”c =” să se execute de numai de 5 ori, dar rezultatele programului sa coincidă cu programul originar. [5
puncte].
5. Fie dat următorul program
#include <omp.h> chunk = 10; result = 0.0;
#include <stdio.h> for (i=0; i < n; i++) {
main () a[i] = i * 1.0; b[i] = i * 2.0; }
{ #pragma omp parallel for default(shared) private(i) schedule(static,chunk) reduction(+:result)
int i, n, chunk; for (i=0; i < n; i++)
float a[100], b[100], result = result + (a[i] * b[i]);
result; printf("Final result= %f\n",result);
n = 100; }
5.1. Explicați ce calculează acest program. [2 puncte].
5.2. Explicați directivele şi clauzele OpenMP şi cum se realizează paralelizarea operațiilor pe fire de execuție. [4 puncte].
5.3. Indicați toate schimbările posibile in program pentru a modifica distribuirea pe fire a operațiilor [4 puncte].
6. Fie dat următorul program
#include<mpi.h> reccount=numtask;
#include<stdio.h> if(myrank==root)
int main(int argc, char *argv[]) {
{ A=(double*)malloc(numtask*numtask*sizeof(double));
int numtask,sendcount,reccount,source; M=(double*)malloc(numtask*sizeof(double));
double *A,*M; for(int i=0;i<numtask*numtask;i++)
int i, myrank, root=0; A[i]=rand()/1000000000.0;
MPI_Init(&argc,&argv); }
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Scatter(A,sendcount,MPI_DOUBLE, Rows,
MPI_Comm_size(MPI_COMM_WORLD, &numtask); reccount,MPI_DOUBLE,root,MPI_COMM_WORLD);
double Rows[numtask]; MPI_Reduce(Rows,M,numtask, MPI_DOUBLE, MPI_MAX,
sendcount=numtask; root, MPI_COMM_WORLD);
MPI_Finalize(); }
return 0;
6.1. Explicați ce calculează acest program, functiile MPI utilizate și parametrii lor [10 puncte]
6.2. Ce mod de paralelizare a datelor poate fi folosit pentru a exclude utilizarea functiei MPI_Scatter [5 puncte].
7. Fie dat următorul program
#include <stdio.h> if (rank_gr != MPI_UNDEFINED)
#include <mpi.h> {
int main(int argc,char *argv[]) MPI_Comm_size(com_new,&size1);
{ MPI_Comm_rank(com_new,&rank1);
int i,p,size,size1,rank,rank1,sour,dest; dims[0]=size1;
int rank_gr; period[0]=1;
MPI_Status status; reord=1;
MPI_Comm com_new,ring1; MPI_Cart_create(com_new,1,dims,period,reord,&ring1);
MPI_Group MPI_GROUP_WORLD, newgr; MPI_Cart_shift(ring1,0,2,&sour,&dest);
int dims[1],period[1],reord; D1=D1+rank;
int ranks[5]={0,1,4,6,9}; MPI_Sendrecv(&D1,1,MPI_FLOAT,dest,12,&D2,1,MPI_FLOAT,
float D1=123,D2; sour,12,ring1,&status);
MPI_Init(&argc,&argv); printf ("Process %d (%d), received from %d the %f and send,
MPI_Comm_size(MPI_COMM_WORLD,&size); to %d the %f\n",rank1,rank,sour,D2,dest,D1);
MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Group_free(&newgr);
MPI_Comm_group(MPI_COMM_WORLD, MPI_Comm_free(&ring1);
&MPI_GROUP_WORLD); MPI_Comm_free(&com_new);
MPI_Group_incl(MPI_GROUP_WORLD,5,ranks,&newgr); }
MPI_Comm_create(MPI_COMM_WORLD,newgr, MPI_Finalize();
&com_new); return 0;
MPI_Group_rank(newgr,&rank_gr); }
7.1. Descrieţi funcţiile MPI pentru gestionarea grupelor de procese, a comunicatoarelor si transmitere de date, utilizate
in acest program şi explicaţi parametrii lor. [10 puncte]
7.2. Ce rezultate va afișa programul executat pe 9 procese, argumentați răspunsul. Reprezentați grafic transmiterea de
date când programul se executa pe 12 procesoare. [10 puncte]
8. Fie dat următorul fragment de program al programului MPI-Spawn.cpp pentru generarea dinamică
a proceselor MPI
#include <mpi.h> ⁞
#include <stdio.h> MPI_Init(&argc, &argv);
int main(int argc, char *argv[]) ⁞
{ MPI_Comm_spawn_multiple(count, worker_program, args,
⁞ universe_size, hostinfo, 0,MPI_COMM_SELF,
int universe_size[count] = {4, 2, 3}; &everyone, err);
char *worker_program[count] = {"./A_1.exe", MPI_Finalize();
"./A_2.exe", "./A_3.exe"}; }
8.1. Indicaţi numărul total de procese MPI generate. [1 puncte].
8.2. Pe câte procese MPI vor fi executate programele A_1.exe, A_2.exe, şi A_3.exe. [2 puncte].
8.3. Descrieţi utilitarul mpirun pentru executarea programului MPI-Spawn.exe. [2 puncte].
9. Fie dat următorul program
#include <stdio.h> sleep(omp_get_thread_num());
#include <omp.h> printf(" OpenMP procesul %d-valoarea lui n dupa clauza
#include <iostream> private: %d\n", omp_get_thread_num(),n);
int main(int argc, char *argv[]) n=omp_get_thread_num();
{ printf(" OpenMP procesul %d-valoarea lui n dupa
int n=1,iam; initializare de catre fir: %d\n",omp_get_thread_num(), n);
printf("Valoarea lui n pana la directiva parallel cu clauza }
private: %d\n", n); printf("Valoarea lui n dupa directiva parallel cu clauza private:
#pragma omp parallel private(n,iam) %d\n", n);
{ }
9.1. Ce rezultate va afișa acest program. Argumentați răspunsul [10 puncte]

Barem de notare: 11-20→nota 3; 21-29→nota 4; 30-45→nota 5; 46-60→nota 6; 61-75→nota 7; 76-85.→nota 8;


86-95.→nota 9; 96-100.→nota 10

5.12.2022 Examinator

S-ar putea să vă placă și