"Cogito ergo sum."

"Remember, remember The fifth of November The gunpowder treason and plot. I know of no reason Why the gunpowder treason Should ever be forgot." - V for Vendetta

Friss topikok

Linkblog

Szál programozás....

2011.12.21. 09:27 Painkiller19910110

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



 

 

Szólj hozzá!

A bejegyzés trackback címe:

https://painkillerblogja.blog.hu/api/trackback/id/tr573480253

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása