Egyik altalam leginkább kedvelt tárgy ebben a félévben a "Nagy számításteljesítményű párhuzamos programozási eszközök" ezt a tárgyat egy kiváló ember és tanár tartotta Kovács György. E félév végen beadandót kellett készíteni egy választott témában. Az én témám pedig Pthread+OpenMP kombó volt. Röviden annyit a programról hogy 10 szálon keresi a prímszámokat mégpedig úgy hogy a megadott intervallumot feldarabolja 10 részre és mindegyik szál meg kap egy kissebb intervallumot. UTánna elindul a keresés itt pedig mutexel van védeve az a kritikus szakasz míg a prímet belerakja a gyüjtő tömbbe. Továb bután a források--->
Forrás:
Makefile
helloszia: nsppaprimkeresoopenmp.c
gcc -o bead nsppaprimkeresoopenmp.c -lpthread -lm -fopenmp -Wall
programkód:
nsppaprimkeresoopenmp.c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define NUM_THREADS 10
int kiiratas;
int meddig;
int primek[30000000];
pthread_mutex_t mut;
struct param
{
int a, b;
};
void *
PrimaVera (void *t)
{
int i;
struct param *tmp = (struct param *) t;
#pragma omp parallel for
for (i = tmp->a; i < tmp->b; ++i)
{
int osztok = 0;
int j;
if (i % 2 == 0 && i != 2)
continue;
for (j = 1; j <= (int) (sqrt (i)); j++)
if (i % j == 0)
osztok++;
if (osztok > 1)
continue;
else
pthread_mutex_lock (&mut);
int index = 0;
while (primek[index] != 0)
index++;
primek[index] = i;
pthread_mutex_unlock (&mut);
}
pthread_exit (NULL);
}
void
usage ()
{
printf ("*****************************************************\n");
printf ("* Használat: ./bead <meddig vizsgáljuk> <kiratas> *\n");
printf ("* Ha kiiratas=1 akkor a végén kiírja a prímeket. *\n");
printf ("* Ha kiiratas=0 akkor a végén NEM írja ki a prímeket*\n");
printf ("*****************************************************\n");
}
int
main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
struct param intervallum[NUM_THREADS];
if (argc < 3)
{
printf ("\nTúl kevés az argumentum!!!\n\n");
usage ();
}
else if (argc > 3)
{
printf ("\nTúl sok az argumentum!!!\n\n");
usage ();
}
else if (argc == 3 && (atoi (argv[2]) > 1 || atoi (argv[2]) < 0))
{
printf ("\nNem megfelelő a harmadik argumentum!!\n\n");
usage ();
}
else
{
meddig = atoi (argv[1]);
kiiratas = atoi (argv[2]);
printf ("\nA választott intervallum 1..%d\n", meddig);
if (kiiratas == 0)
printf ("\nNem kell kiíratni a végén a prímeket!\n");
else
printf ("\nKi kell íratni a végén a prímeket!\n\n");
int i;
void *status;
pthread_mutex_init (&mut, NULL);
#pragma omp parallel for
for (i = 0; i < 30000000; i++)
primek[i] = 0;
#pragma omp parallel for
for (i = 0; i < NUM_THREADS; i++)
{
intervallum[i].a = meddig / NUM_THREADS * i;
intervallum[i].b = meddig / NUM_THREADS * (i + 1);
pthread_create (&threads[i], NULL, PrimaVera,
(void *) &intervallum[i]);
}
for (i = 0; i < NUM_THREADS; i++)
pthread_join (threads[i], &status);
if (kiiratas)
{
for (i = 0; i < 300000000; i++)
{
if (primek[i] == 0)
break;
printf ("%d ", primek[i]);
}
}
printf ("\n");
pthread_mutex_destroy (&mut);
pthread_exit (NULL);
}
return 0;
}
kimenete:
time ./bead 1000 0
A választott intervallum 1..1000
Nem kell kiíratni a végén a prímeket!
real 0m0.169s
user 0m0.108s
sys 0m0.144s
./bead 100000 0
A választott intervallum 1..100000
Nem kell kiíratni a végén a prímeket!
real 0m0.558s
user 0m0.692s
sys 0m0.168s