Upgrade to Pro — share decks privately, control downloads, hide ads and more …

spr1_2018ZR.pdf

Bartosz Górka
June 06, 2018
15

 spr1_2018ZR.pdf

Bartosz Górka

June 06, 2018
Tweet

Transcript

  1. Sprawdzian PR 10.04.2018 #include <stdio.h> int main() { int tab[100],i,zmienna=0;

    for(i=0;i<100;i++) tab[i]=i; #pragma omp parallel for schedule(static,10)reduction(zmienna:+) for(i=0;i<30;i++) { tab[i]+= tab[i+10]; zmienna+=i; } #pragma omp atomic zmienna+=zmienna; } Odpowiedz i uzasadnij (odpowiadając na pytania) jaki będzie efekt realizacji kodu a) czy kod jest deterministyczny (zwraca zawsze ten sam wynik)? Kod nie jest deterministyczny, gdyż nie znamy kolejności dostępu do elementów zmiennej tab[], a ostateczne wartości elementów tab[] są zależne od kolejności operacji (jeden wątek wykorzystuje wartość elementu zmiennej wyznaczaną przez inny wątek). b) czy w kodzie występuję wyścig w dostępie do danych, jeśli tak to której zmiennej dotyczy? wyścig występuje w dostępie do elementu współdzielonej zmiennej tab[] – jest to sytuacja nadpisania przez jeden proces odczytanych przez drugi proces wartości zmiennej, w pierwszym procesie może być wykorzystywana stara wartość zmiennej mimo, że aktualna wartość jest już inna. Zatem wynik kodu może być zależny od kolejności dostępów, która nie jest zdeterminowana. Możliwy przebieg działań w przetwarzaniu powyższego kodu: Wątek czyta wartość elementu tab[10] a następnie z niej korzysta w czasie, gdy wartość elementu została zmieniona już (lub jeszcze nie) przez drugi watek. c) czy w kodzie występuje false sharing, jeśli tak, to której zmiennej dotyczy? False sharing to sytuacja, gdy między watkami przetwarzanymi na różnych procesorach, mimo że korzystają z różnych obiektów danych, występuje zależność widoczna w procesie pozyskiwania danych. Ze względu na ziarnistość operacji unieważnienia zapis realizowany przez jeden wątek może powodować unieważnienie kopii linii danych wykorzystywanej już wcześniej przez inny wątek na innym procesorze i wystąpi konieczność pobrania aktualnej postaci linii danych mimo, że potrzebne wątkowi dane są niezmienione (znajdują się w linii unieważnionej). (unieważnia się całą linię – każdą nieaktualną już kopię zabrudzonej linii pamięci podręcznej). Możliwy przebieg kodu: Podczas czytania elementu po przeczytaniu tab[10] może zostać zmieniony na drugim procesorze (inna pamięć podręczna) element tab[14] co spowoduje konieczność pobrania zmienionej linii pamięci podręcznej do procesora pierwszego, aby odczytać tab[11]. tab[10] do tab [25] mogą się znajdować w tej samej linii pp (64 bajty). d) czy nastąpi unieważnienie zmiennych, czy nastąpi unieważnienie linii pamięci, która zmienna/linia pamięci podręcznej zostanie unieważniona ? Unieważnienie linii (nie zmiennej) występuje jeśli przetwarzanie odbywa się na różnych procesorach:  podczas false sharing (opisane powyżej) oraz  podczas uaktualniania współdzielonej wartości zmiennej zmienna na skutek dyrektywy reduction – wątki na różnych procesorach wykonują kolejno odczyt i zapis, wynikiem zapisu jest unieważnienie wcześniej używanych kopii linii pp. e) co to jest linia pamięci podręcznej? Jest to ciągły obszar danych w przestrzeni adresowej pamięci operacyjnej komputera (o wielkości 64 Bajty) rozpoczynający się do granicy – adresu pamięci będącego wielokrotnością 64 – 0,64,128… Dane obszaru linii pp są pobierane w całości do pamięci podręcznej (i w całości przenoszone miedzy poziomami pamięci). Obszar ten charakteryzuje się stanem zależnym od wykonanych na elementach operacjach oraz zastosowanego algorytmu zapewnienia spójności danych powielonych np. stan współdzielony, zabrudzony, unieważniony.