Advertisement
m4ly

PVM Zadanie 2

Jun 24th, 2014
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.33 KB | None | 0 0
  1. /*
  2. Dawid Mocek
  3.  
  4. Kod przetestowany na własnym klastrze PVM(PVM_ARCH=FREEBSD). Działa. Nie zakładam istnienia obiektu typu string bo to jest C  oraz nie wiem czym dokładnie jest generacja skrótu łańcuchowego(patrz kod workera/slave`a) w workerze
  5.  
  6. */
  7.  
  8. /*
  9. Zad. 2 PVM
  10. Napisać kod programu głównego,
  11.     1) uruchamiajacego na każdym dostępnym w maszynie PVM procesorze jeden proces potomny
  12.     2) rozdzielającego do równoległego wyliczenia, skrótu łańcuchów znakowych znajdujących się w tablicy NAPSIY. Tablica NAPISY
  13.        posiada N wpisów w postaci łańcuchów znakowych. Dla ułatwienia przyjąć dostępność obiektu typu string.
  14.        Założyć, iż skrót dla pojedynczego napisu wyznaczony jest przez proces potomny(którego nie należy pisać).
  15.            Skróty poszczególnych łańcuchów w postaci wartości typu INT umieścić w programie głównym w tablicy skróty, aby ity skrót
  16.            odnosił się do itego łańcucha
  17.     3) zapewnić zrównoważenie obciążenia procesów potomnych przez dynamiczny przydział zadań
  18.     4) zakończyć procesy potomne
  19.  
  20. */
  21. /*-----------------------------------*/
  22. /*
  23. [dawid@freeone ~]$ cat kompiluj.sh
  24. #!/bin/sh
  25.  
  26. /usr/local/bin/gcc47 -lpvm3 /home/dawid/pvm.c -o /home/dawid/pvm
  27. /usr/local/bin/gcc47 -lpvm3 /home/dawid/zadanie.c -o /home/dawid/zadanie
  28. echo "Kopiowanie do freetwo.com"
  29. scp zadanie [email protected]:~
  30.  
  31. echo "Kopiowanie do freethree.com"
  32. scp zadanie [email protected]:~
  33.  
  34. */
  35.  
  36. /***
  37.  * config.h
  38.  */
  39. #define N 11
  40. #define FLAGA_ROZPOZNAWCZA_WORKERA 1111
  41. #define FLAGA_ROZPOZNAWCZA_MASTERA 999
  42. #define WORKER_PATH "/home/dawid/zadanie"
  43.  
  44. /***
  45.  * pvm.c
  46.  * Dawid Mocek
  47.  */
  48.  
  49. #include <stdio.h>
  50. #include <stdlib.h>
  51. #include <string.h>
  52. #include <pvm3.h>
  53. #include <sys/unistd.h>
  54. #include "config.h"
  55.  
  56. int *podziel_na_czesci(int liczba_elementow, int liczba_hostow) {
  57.     int i, j, k,  *tab = NULL;
  58.     tab = (int *)calloc(liczba_hostow, sizeof(int));
  59.  
  60.     // tu mamy po rowno elementow
  61.     if ((liczba_elementow % liczba_hostow) == 0) {
  62.         k = (liczba_elementow / liczba_hostow);
  63.         for (i = 0; i < liczba_hostow; ++i)
  64.             tab[i] = k;
  65.     }
  66.     // a tu nie
  67.     else {
  68.         k = liczba_elementow / liczba_hostow;
  69.         for (i = 0; i < liczba_hostow ; ++i)
  70.             tab[i] = k;
  71.         tab[i - 1] += liczba_elementow - (k * liczba_hostow);
  72.     }
  73.     return tab;
  74. }
  75.  
  76. int main(void) {
  77.     int ilhost, ilarch, mytid, indeks, id_procesu, i, j, len, skrot, pvm_res, bytes, msgtag;
  78.     int *nasze_procesy = NULL;
  79.     int *ilosc = NULL;
  80.     struct pvmhostinfo *info = NULL;
  81.     char hostname[128];
  82.  
  83.     char *napisy[N] = {  "abcff", "defggg", "ghhdfg", "isdfsdfjk", "sdflmn", "opqrst", "aabb", "ccdd", "eeff", "gguu", "hhoo" };
  84.     int skroty[N];
  85.  
  86.     // Dla wiedzy skad gdzie co leci
  87.     gethostname(hostname, sizeof hostname);
  88.  
  89.     //  PVM
  90.     mytid = pvm_mytid();
  91.  
  92.     // Dla debugu - lapiemy co rzygajaja spawn'owane procesy
  93.     pvm_catchout(stdout);
  94.  
  95.     // Pobieram  konfig. pvma - najwazniesza stad to ilosc hostow(ILe HOSTow) i struct info
  96.     pvm_config(&ilhost, &ilarch, &info);
  97.  
  98.     // Musimy rozlozyc ilosc strigow jakie wysylamy w zaleznosci od ilosc hostow
  99.     ilosc = podziel_na_czesci(N, ilhost);
  100.  
  101.     // Tu trzymamy id procesow
  102.     nasze_procesy = (int *)calloc(ilhost, sizeof(int));
  103.  
  104.     indeks = 0;
  105.     for(i = 0; i < ilhost; i++) {
  106.  
  107.         // Spawn`ujemy proces na remote hoscie
  108.         printf("[%s] Spawnuje proces na hoscie: %s\n", hostname, info[i].hi_name);
  109.         pvm_spawn(WORKER_PATH, (char **)0, PvmTaskHost, info[i].hi_name, 1, &id_procesu);
  110.  
  111.         // Zapamietuje id procesu
  112.         printf("[%s] Numer procesu: %d @ %s\n", hostname, id_procesu, info[i].hi_name);
  113.         nasze_procesy[i] = id_procesu;
  114.  
  115.         // Przygotowujemy sie do wysylki danych
  116.         pvm_initsend(PvmDataDefault);
  117.  
  118.         printf("[%s] Iteracja = %d. Wysylam stringow = %d\n", hostname, i, ilosc[i]);
  119.  
  120.         // Nasz worker musi wiedziec ile pakietow do niego dojdzie
  121.         pvm_pkint(&ilosc[i], 1, 1);
  122.         printf("[%s] Pakuje ilosc: %d\n", hostname, ilosc[i]);
  123.  
  124.         for(j = 0; j < ilosc[i]; indeks++, j++) {
  125.             len = strlen(napisy[indeks]);
  126.  
  127.             // Pakuje indeks tablicy **napisy
  128.             pvm_pkint(&indeks, 1, 1);
  129.  
  130.             // Pakuje dlugosc stringa - bez nulla
  131.             pvm_pkint(&len, 1, 1);
  132.  
  133.             // Pakuje stringa
  134.             pvm_pkstr(napisy[indeks]);
  135.  
  136.             printf("[%s] Pakuje stringa: '%s' z pod indeksu: %d o dlugosci = %d\n", hostname, napisy[indeks], indeks, len);
  137.  
  138.         }
  139.          // Wysylam
  140.         pvm_send(id_procesu, FLAGA_ROZPOZNAWCZA_MASTERA);
  141.      }
  142.  
  143.  
  144.     // koniec wysylania
  145.     // teraz czas to odebrac
  146.  
  147.     // Czekamy na rezultaty
  148.     printf("[%s] Odbieram dane...\n", hostname);
  149.     for(i = 0; i < N; i++) {
  150.  
  151.         // Pobieram
  152.         pvm_res = pvm_recv(-1, -1);
  153.  
  154.         // Informacje skad odebralismy i ile
  155.         pvm_bufinfo(pvm_res, &bytes, &msgtag, &id_procesu);
  156.  
  157.         // Sam worker musi nam opdowiedziec dwoma pakietami - indeksem i wynikiem
  158.         printf("[%s] Dostalem bajtow: %d od procesu: %d z tagiem %d\n",hostname, bytes, id_procesu, msgtag);
  159.  
  160.         // Wypakowuje indeks:
  161.         pvm_upkint(&indeks, 1, 1);
  162.  
  163.         // Wypakowuje wygenerowy "skrot" - czymkolwiek on jest
  164.         pvm_upkint(&skrot, 1, 1);
  165.  
  166.         // Zapisuje
  167.         skroty[indeks] = skrot;
  168.  
  169.         // zabijam proces
  170.         pvm_kill(id_procesu);
  171.     }
  172.  
  173.     // Druk wyniku
  174.     printf("--------------------\n");
  175.     for(j = 0; j < N; ++j)
  176.         printf("Skrot dla: '%s' = %d\n", napisy[j], skroty[j]);
  177.  
  178.     free(nasze_procesy);
  179.     free(info);
  180.     free(ilosc);
  181.     pvm_exit();
  182. }
  183.  
  184.  
  185. /***
  186.  * zadanie.c
  187.  * Dawid Mocek
  188.  */
  189. #include <stdlib.h>
  190. #include <stdio.h>
  191. #include <string.h>
  192. #include <sys/unistd.h>
  193. #include <pvm3.h>
  194. #include "config.h"
  195.  
  196. int main(void) {
  197.  
  198.     int mytid;
  199.     int skrot, len, i, j, cnt;
  200.     int indeks, master, pvm_res;
  201.     char *str = NULL;
  202.     char hostname[128];
  203.  
  204.     gethostname(hostname, sizeof hostname);
  205.  
  206.     // Ja
  207.     mytid = pvm_mytid();
  208.  
  209.     // Odbieramy dane
  210.     pvm_recv(-1, -1);
  211.  
  212.     // Ilosc pakietow
  213.     pvm_upkint(&cnt,1 ,1);
  214.     printf("[%s][%d] Dostalem pakietow %d.\n", hostname, mytid, cnt);
  215.  
  216.     for(j = 0; j < cnt; j++) {
  217.  
  218.         // Wypakowuje indeks
  219.         pvm_upkint(&indeks, 1, 1);
  220.  
  221.         // Wypakowuje dlugosc stringa
  222.         pvm_upkint(&len, 1, 1);
  223.  
  224.         // Rezerwujemy pamiec
  225.         str = (char *)malloc((sizeof(char) * len) + sizeof(char));
  226.         memset(str, 0, (len * sizeof(char)) + sizeof(char));
  227.  
  228.         // Wypakowuje stringa
  229.         pvm_upkstr(str);
  230.  
  231.         printf("[%s][%d] Dostalem string: '%s' z pod indeksu: %d o dlugosc %d.\n", hostname, mytid, str, indeks, len);
  232.  
  233.         // Generujemy skrot - generalnei co zrobie to zamienie kazdy znak na int`a(procz nulla) i dodam je do siebie
  234.         skrot = 0;
  235.         for(i = 0; i < len; i++)
  236.             skrot += (int)str[i];
  237.  
  238.         // Master
  239.         master = pvm_parent();
  240.         pvm_initsend(PvmDataDefault);
  241.  
  242.         // Pakuje indeks
  243.         pvm_pkint(&indeks, 1, 1);
  244.  
  245.         // Pakuje skrot
  246.         pvm_pkint(&skrot, 1, 1);
  247.  
  248.         // Wysylam
  249.         pvm_res = pvm_send(master, FLAGA_ROZPOZNAWCZA_WORKERA);
  250.  
  251.         free(str);
  252.         str = NULL;
  253.     }
  254.  
  255.     pvm_exit();
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement