Semestrálna skúška 2020/2021 - riadny termín
Př. 1
cena XOR
- casova zlozitost OR
- cena suctu? maxima a minima
Řešení:
[podle toho jak to bylo v minulych letech, overte mi prosim]
- cas XOR
- EREW log n
- CREW log n
- Common CRCW log n
- cena sum
- EREW n*log n
- CREW n*log n
- Common CRCW n*log n
- cena max/min
- EREW n*log n
- CREW n*log n
- Common CRCW n*log n
+2
Př. 2
Operace testAndSet
[asi jde o semafor?]
[Nope. Semafory jsou uz reseni vzajemneho vylouceni bez aktivniho cekani. Tady jde o zpusob, kdy ve while proces, ktery ceka na kritickou sekci, testuje testAndSet(&lock) porad dokola, viz prezentace Vzajemne vylouceni]
Řešení:
- inštrukcia, ktorá niečo otestuje a výsledkom je hodnota 0/1 na nejakej adrese v pamäti
- je to atomická inštrukcia, teda otestuje a rovno nastaví hodnotu na 1
- riešenie pre dva procesy:
- proces chce vstúpiť do kritickej sekcie
- procesy zdieľajú hodnotu lock, ktorá je na začiatku 0 (odomknuté)
- ak na testandset narazil prvý proces:
- test vráti z lock 0 (je odomknutý)
- set nastaví lock = 1
- vstúpi do kritickej sekcie
- lock je potom atomicky zamknutý a proces je v kritickej sekcii
- ak chce pristúpiť do kritickej sekcie ďalší proces:
- test vráti z lock 1 (je zamknutý)
- set nastaví lock = 1
- čaká v smyčke while na uvolnenie zámku
- ak prvý proces opustí kritickú sekciu, nastaví lock = 0 (odomkne zámok)
- druhý proces môže vstúpiť do kritickej sekcie
Př. 3
kauzalita
Řešení:
[obrazek: image44]
Př. 4
Euler tah -suffix?
Řešení:
Př. 5
R-A
Řešení:
Algoritmus Ricart-Agrawala
– Jedná se o optimalizaci Lamportova algoritmu
Př. 6
Euler strom/graf?
Řešení:
Př. 7
Carry look ahead add - spocitat 39 a 110
r
Řešení:
-
Prevest do bin
- 39: 00100111
- 110: 01101110
-
Spočítať pole di pomoci a. b. kde di \in {propagate, generate, stop}
- if xi 1 and yi 1 → di = g // nevadi co prislo zhora, vzdu bude carry
- if xi 0 and yi 0 → di = s // nevadi co prislo zhora, nikdy nebude carry
- else di = p // carry zavisi na tom, co prijde zhora
Pro nas priklad
x : 0 0 1 0 0 1 1 1
y : 0 1 1 0 1 1 1 0
d : s p g s p g g p // initialni vector
- Pocitam co bude v dalsim kroku, aktulani di <tecka v kolecku> di-1 (pro prvni hodntu di-1 = s - neutralni prvek)
osa X: to bylo pred tim (di-1)
osa Y: co je v init vectoru (di)
[obrazek: image45]
x : 0 0 1 0 0 1 1 1
y : 0 1 1 0 1 1 1 0
d : s p g s p g g p
d’: s g g s g g g s s
- Pocitame carry bit - pokud je s/p → nasledujici carry bit ja 0, jinak 1
x : 0 0 1 0 0 1 1 1
y : 0 1 1 0 1 1 1 0
d : s p g s p g g p
d’: s g g s g g g s s
c : 1 1 0 1 1 1 0 0
- Delam summu xi + yi + ci
x : 0 0 1 0 0 1 1 1
y : 0 1 1 0 1 1 1 0
d : s p g s p g g p
d’: s g g s g g g s s
c : 1 1 0 1 1 1 0 0
z : 1 0 0 1 0 1 0 1 == 149
Overte me prosim vas
+2
Př. 8
naprogramovat s log zlozitostou sucet hodnot vacsich nez priemer
Řešení:
MPI_Init(&argc, &argv);
int rank,size,sum;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int buf=(rank*1234)%33; //“random” data
MPI_Reduce(&buf,&sum,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
double avg;
if (rank == 0) avg = (double)sum / (double)size;
MPI_Bcast(&avg,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
buf = (buf > avg) ? buf : 0;
int sum;//jiz definovany vyse
MPI_Reduce(&buf,&sum,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
if (rank == 0) std::cout << sum << std::endl;
MPI_Finalize();
Semestrálna skúška 2020/2021 - 1. opravný termín
Př. 1
PRAM složitosti,
Řešení:
Př. 2
PRAM architektura (popis+obrazek) ,
Řešení:
Př. 3
Pi kalkul (redukce+pozorování),
Řešení:
Př. 4
Random mating(příklad),
Řešení:
Př. 5
Suzuki (princip+obrazek 4 uzly),
Řešení:
Př. 6
Monitor(popsat wait/signal, obrázek),
Řešení:
- je to high-level jazyková konštrukcia, ktorá poskytuje rovnakú funkcionalitu ako semafory, ale je jednoduchší na použitie
- môže byť implementovaný pomocou semaforov
- je to softvérový modul ktorý obsahuje:
- jednu alebo viac procedúr
- inicializačnú sekvenciu
- lokálne premenné
- charakteristiky:
- lokálne premenné sú prístupné len procedúram monitoru
- proces vstúpi do monitoru tým že zavolá jednu z jeho procedúr
- len 1 proces môže byť v monitore v jednom čase
- pre každú podmienkovú premennú obsahuje vnútornú frontu
- naviac má jednu urgentnú frontu
- monitor nám zaručuje vzájomné vylúčenie (mutual exclusion) a nepotrebujeme ho pritom naprogramovať ručne, čiže naše zdieľané dáta sú chránené ak ich umiestnime do monitoru
- Condition variables
- sú prístupné len z monitoru
- môže sa k ním pristúpiť len z týchto 2 funkcí:
- wait(a) - blokuje vykonanie volajúceho procesu na podmienke a
- proces môže pokračovať len ak iný proces zavolá signal(a) - signal(a) - vzbudí pokračovanie vykonávania nejakého procesu, ktorý čaká na podmienku a
- wait(a) - blokuje vykonanie volajúceho procesu na podmienke a
[obrazek: image25]
[obrazek: image26]
Př. 7
Linda ( reverz seznamu)
Řešení:
TID id, prev, next;
int val;
rd(“list”, “head”, ?id);
in(“list”, id, ?next, ?val);
out(“list”, id, NULL, val);
prev = id;
id = next;
while(id != NULL) {
in(“list”, id, ?next, ?val);
out(“list”, id, prev, val);
prev = id;
id = next;
}
out(“list”, “head”, prev);
— netreba sa este zbavit original headu?
— cize pred poslednym riadkom:
— in(“list”, “head”, ?id);
Př. 8
MPI ( součet čísel větších jak průměr)
Řešení:
Semestrálna skúška 2020/2021 - 2. opravný termín
Př. 1
PRAM tipovačka
Řešení:
Př. 2
VLIW + ako sa riešia konflikty
Řešení:
Př. 3
Monitor - popis + obrázok
Řešení:
- je to high-level jazyková konštrukcia, ktorá poskytuje rovnakú funkcionalitu ako semafory, ale je jednoduchší na použitie
- môže byť implementovaný pomocou semaforov
- je to softvérový modul ktorý obsahuje:
- jednu alebo viac procedúr
- inicializačnú sekvenciu
- lokálne premenné
- charakteristiky:
- lokálne premenné sú prístupné len procedúram monitoru
- proces vstúpi do monitoru tým že zavolá jednu z jeho procedúr
- len 1 proces môže byť v monitore v jednom čase
- pre každú podmienkovú premennú obsahuje vnútornú frontu
- naviac má jednu urgentnú frontu
- monitor nám zaručuje vzájomné vylúčenie (mutual exclusion) a nepotrebujeme ho pritom naprogramovať ručne, čiže naše zdieľané dáta sú chránené ak ich umiestnime do monitoru
- Condition variables
- sú prístupné len z monitoru
- môže sa k ním pristúpiť len z týchto 2 funkcí:
- wait(a) - blokuje vykonanie volajúceho procesu na podmienke a
- proces môže pokračovať len ak iný proces zavolá signal(a) - signal(a) - vzbudí pokračovanie vykonávania nejakého procesu, ktorý čaká na podmienku a
- wait(a) - blokuje vykonanie volajúceho procesu na podmienke a
[obrazek: image25]
[obrazek: image26]
Př. 4
Problém 5 filozofov - kód so semaformi + popis ako to funguje (plus musel byt deadlock proof ten kód)
Řešení:
Jde o úlohu, kde 5 filosofů/procesů v náhodných chvílích buď přemýšlí, žádají o vidličku nebo jedí. Pokud chce filosof jíst, musí získat 2 sdílené zdroje/vidličky, kdy jedna je od něj vlevo a druhá vpravo. Zároveň jsou vidličky ale sdílené se sousedními filosofy. Řešení, kde je ošetřena možnost uváznutí:
semaphore E;
fork = array[0..4] of semaphore;
initialize:
E.count = 4; //porusime cyklickou ozavislost (viz Coffmanovy podminky), nechame jist pouze 4 z 5 filosofu
for i=0..4 {fork[i] = 1;} //jen jeden proces muze danou vidlicku v jednu chvili vlastnit
filosof:
repeat
think;
P(E);
P(fork[i]); //leva vidlicka - kdo to v tom nevidi, necht si nakresli stul s 5 procesy okolo a 5 vidlicek
//nutne si indexy nakreslit proti smeru hodinovych rucicek a kazda leva vidlicka bude mit
//dany index procesu
P(fork[i+1 mod 5]); //prava vidlicka
eat;
V(fork[i+1 mod 5]);
V(fork[i]);
V(E);
forever
Př. 5
Nieco s FIFO a broadcastom, nejaká random tabuľka, v živote som to nevidel
Řešení:
Př. 6
Random mating (pravdepodobne 1:1 recycle z 1. opravného)
Řešení:
Př. 7
OCCAM - naprogramovanie procedúry AVG, ktorá má tri kanály typu BYTE a to DATA, CHNH, CHNL. Procedúra berie čísla z kanálu DATA, počíta z nich dlhodobý priemer, a podľa toho či číslo, ktoré prišlo je väčšie alebo menšie ako priemer tak ho pošle príslušnému kanálu. (nepísal však ktorému tak som predpokladal, že CHNH je pre väčšie čísla a ten druhý je pre menšie alebo rovné (ale tá rovnosť nebola explicitne zmienená)).
Řešení:
Pomocí různých jiných řešení jsem se to pokusil splácat, ale netuším jestli to je dobře, tak je na vás jestli tomu chcete věřit, možná by nad SEQ mělo být WHILE TRUE, idk:
PROC avg(CHAN OF BYTE DATA, CHNH, CHNL)
INT counter := 0
INT sum := 0
INT value :
INT avg :
SEQ
counter := counter + 1
DATA ? value
sum := sum \+ value
avg := sum/counter
IF
value \<= avg
CHNL \! value
value \> avg
CHNH \! value
Já bych udělal paralelní sekci pro výpočet meanu a pro výstup, což by taky znamenalo, že aktuální hodnota by se nepočítala do dlouhodobého průměru při rozhodování, na který výstup se hodnota pošle. Možná to i dává větší smysl, říct, zda je hodnota větší nebo menší než dosavadní průměr a až potom upravit ten průměr.z
Př. 8
MPI - “spočítať sumu menších čísiel v postupnosti ako je jej minimum” ⇐ potom sa na upozornenie opravil a povedal, že si máme zvoliť menších ako maximum alebo väčších ako minimum
Řešení:
MPI_Init(&argc, &argv);
int rank,size,sum;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int buf=(rank*1234)%33; //“random” data
int max;
MPI_Reduce(&buf,&max,1,MPI_INT,MPI_MAX,0,MPI_COMM_WORLD); // root process receives max → this value need to be sent to all other processes
MPI_Bcast(&max, 1, MPI_INT, 0, MPI_COMM_WORLD);
int val = buf < max ? buf : 0 ;
int sum;
MPI_Reduce(&val,&sum,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
if (rank == 0) std::cout << sum << std::endl;
MPI_Finalize();
Myslím, že MPI_Reduce a MPI_Bcast mohou být nahrazeny MPI_Allreduce.
Ale v zadani je uvedeno (ne tady, ale v originalnim) ze muzeme pouzit jenom cMPI_Reduce a MPI_Bcast