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;
}

Niciun comentariu: