22 noiembrie 2011

Cautare paralela in OpenMP

Mai demult scriam o postare despre cautarea in paralel in Java, folosind thread-uri. De data aceasta am scris si in OpenMP, si este mult mai intuitiv si usor de inteles decat inainte.

De la tastatura se dau: n (nr de elemente), x (numarul cautat) si p (numarul de procesoare); se genereaza apoi n numere naturale intr-un vector care se ordoneaza folosind quicksort si pe care se va face cautarea paralela. Pozitia afisata reprezinta pozitia in acest vector ordonat.

#include "omp.h"
#include "stdio.h"
#include "stdlib.h"

int min (int a, int b) {

if (a < b)
return a;
return b;
}

int comp (const void * a,const void * b) {

if (*((int*)a)==*((int*)b))
return 0;
if (*((int*)a) < *((int*)b))
return -1;
return 1;
}

void cautare (int x, int a[], int n, int left, int right, int p) {

int pas = (right-left)/p+1;
int i, aux = -1;

if(left == right && a[left]==x)
return ;

#pragma omp parallel private(i) num_threads(p)
{
#pragma omp for
for(i = left; i<=right; i+=pas) {

int tid = omp_get_thread_num();
int next = min (n-1, i+pas-1);

if(a[i]<=x && x <= a[next]) {
aux = i;
if (i != next)
printf ("Thread %d a gasit: intre pozitiile %d si %d\n", tid, i, next);
else
printf ("Thread %d a gasit pozitia = %d\n", tid, i);
}
}
}
if(aux >= 0)
cautare (x,a,n,aux,aux+pas-1,p);
else
printf ("Element inexistent\n");
}

int main() {

int *a, n, i, p, x;

unsigned int iseed = (unsigned int)time(NULL);
srand (iseed);

printf ("n=");
scanf ("%d", &n);

a = (int *)malloc (n*sizeof(int));

for (i=0; i < n; i++)
a[i] = rand () % 1000;

// sortare a
qsort((void*)a, n, sizeof(int), comp);
printf ("Multime: {");
for (i=0; i < n-1; i++)
printf ("%d, " , a[i]);
printf ("%d}\n", a[n-1]);

printf ("x=");
scanf ("%d", &x);
printf ("p=");
scanf ("%d", &p);

cautare (x,a,n,0,n-1,p);

return 0;
}

18 noiembrie 2011

Proceduri PL/SQL

Arhiva conține rezolvări pentru exercițiile următoare:
(pe un tabel studenti cu câmpuri pentru matricol, nume, grupa, medie, bursa)

1. procedură nestocată cu parametru un număr fond_pentru_burse care va seta bursele studenților cu media > 7. Bursele sunt proporționale cu media, fondul trebuie consumat integral.
2. procedură nestocată care calculează pentru o grupă dată ca parametru: nr de studenți, media mediilor și suma burselor acordate. Apelată pentru toate grupele din tabelă
3. procedură stocată pe server ce include un cursor explicit, primește ca parametri 2 numere: medie și bonus. Iterează pe mai mulți studenți cu media > medie și adaugă bonusul la valoarea bursei lor.

Simulare CW-PRAM in MPI

Următorul program simulează cererile de scriere a 4 procesoare conectate la o memoria partajată. Conform logicii descrise în pdf [1] și a priorității procesoarelor, dispozitivul de control al memoriei poate îndeplini cererea și scrie în memoria partajată la o anumită adresă, sau nu.
Pentru comunicațiile între procesoare și dispozitivul de control s-au folosit operațiile de send/receive ale MPI-ului.

[1] arhiva se poate descărca de aici