Zrównoleglanie procesów obliczeniowych (dyskusja)

0

Hej,
próbuję ogarnąć teraz m. in. język maszynowy, może mi pomożecie ciut. Generalnie z tego co się orientuję, to instrukcje są wykonywane sekwencyjnie na rejestrach.

Opiszę trzy podejścia do obliczeń, i jakby ktoś mi to ogarnął ogólnie, albo podał jakiś link do ciekawych opracowań na ten temat to byłby wdzięczny.

  1. Wykonywanie instrukcji za pomocą kodu maszynowego. Instrukcje są wykonywane sekwencyjnie. Czy są jakieś przypadki wpółbieżności/równoległości wykonywania instrukcji na rejestrach na jednym rdzeniu procka ??

  2. Współbieżność (na przykładach wątków w Javie). Czy te wątki są wykonywane rzeczywiście równolegle w zależności od ilości rdzeni procesora ?? Czyli jak mamy cztery rdzenie, to jest możliwość odpalenia procka tak, aby cztery rdzenie pracowały na full ?? Jak wygląda sprawa związana z dwoma równocześnie odpalonymi programami (niekoniecznie w Javie) ?? Czy to działa na zasadzie współbieżności ?? Czy wątki są przeplatane na procku (czyli jest sekwencja), a my mamy złudzenie działania równoległego/współbieżnego ??

  3. Obliczanie równoległe (MapReduce/Hadoop): tu sytuacja jest powiedzmy prosta. Mamy pliki zapisane w odpowiednim formacie, chyba .hdfs i są one rozproszone po różnych węzłach klastra (pytanie jak to rozproszenie wygląda, czy jest to robione według jakiegoś klucza ?? ktoś coś ?? jest jakaś reguła współdzielenia pliku na różnych kompach ??). I idea wykonywania obliczeń jest w miarę prosta, wykonujemy obliczanie na każdym węźle, a potem MapReduce nam to zbiera w całość.

Na razie tyle :)

1

instrukcje są wykonywane sekwencyjnie na rejestrach.

To zdanie nie ma sensu.

Czy są jakieś przypadki wpółbieżności/równoległości wykonywania instrukcji na rejestrach na jednym rdzeniu procka ?

Zdecyduj się czy chcesz rozmawiać o współbieżności czy zrównolegleniu.

Czy te wątki są wykonywane rzeczywiście równolegle w zależności od ilości rdzeni procesora ?

Decyduje o tym scheduler systemu operacyjnego - w pewnym uproszczeniu: tak.

Czyli jak mamy cztery rdzenie, to jest możliwość odpalenia procka tak, aby cztery rdzenie pracowały na full ?

Tak.


Większość Twoich pytań jest niestety ciężko zrozumiała - polecam na sam początek zapoznać się z różnicą między współbieżnością a zrównolegleniem ;-)

1
hurgadion napisał(a):

Hej,
próbuję ogarnąć teraz m. in. język maszynowy, może mi pomożecie ciut. Generalnie z tego co się orientuję, to instrukcje są wykonywane sekwencyjnie na rejestrach.

Opiszę trzy podejścia do obliczeń, i jakby ktoś mi to ogarnął ogólnie, albo podał jakiś link do ciekawych opracowań na ten temat to byłby wdzięczny.

  1. Wykonywanie instrukcji za pomocą kodu maszynowego. Instrukcje są wykonywane sekwencyjnie. Czy są jakieś przypadki wpółbieżności/równoległości wykonywania instrukcji na rejestrach na jednym rdzeniu procka ??

W sumie to w pewnym sensie jest współbieżność, ale nie tak, jak to ujmujesz. Jest Hyper-Threading w którym są min. dwa rdzenie logiczne na jeden fizyczny tzn jednostka wykonawcza jest wspólna dla kilku kontekstów więc można szybciej przełączyć się między dwoma wątkami które akurat ten rdzeń ma w kontekstach, ale to jest wykonanie w przeplocie. Wykonanie współbieżne, ale tylko w pewnym sensie, daje przetwarzanie potokowe obecne w chyba każdym nowoczesnym procesorze - wykonanie jednej instrukcji ma kilka etapów (pobranie rozkazu, dekodowanie, pobranie danych, wykonanie, zapis wyniku) więc w jednym momencie używany jest jeden z tych "modułów" procesora, przetwarzanie potokowe polega na tym, że kiedy jeden rozkaz jest dekodowany to kolejny jest już pobierany, a poprzedni pobiera dane lub się wykonuje etc. Wykonanie pozostaje niby sekwencyjnie, ale czas wykonania kilku instrukcji nakłada się na siebie.

  1. Współbieżność (na przykładach wątków w Javie). Czy te wątki są wykonywane rzeczywiście równolegle w zależności od ilości rdzeni procesora ?? Czyli jak mamy cztery rdzenie, to jest możliwość odpalenia procka tak, aby cztery rdzenie pracowały na full ?? Jak wygląda sprawa związana z dwoma równocześnie odpalonymi programami (niekoniecznie w Javie) ?? Czy to działa na zasadzie współbieżności ?? Czy wątki są przeplatane na procku (czyli jest sekwencja), a my mamy złudzenie działania równoległego/współbieżnego ??

Z tego co kojarzę JVM potrafi rozbić wątki pomiędzy różne procesy. Języki korzystające z wątków na poziomie systemu operacyjnego raczej też będą to wspierać, bo OS jest w stanie podzielić wątki jednego procesu między wiele procesorów - to się chyba procesami lekkimi nazywało ale głowy nie dam. Złudzenie wykonania równoległego mamy w Pythonie jeżeli korzystamy z wątków, ze względu na mało sprytny GIL przez który właściwie wszystko leci w przeplocie, ale pisząc program wieloprocesowy (multiprocessing / concurrent / dask) masz już normalnie wykonanie równolegle na wielu procesorach. Nie wiem za bardzo jak jest w JS, może @czysteskarpety będzie wiedział?

Na 3. nie odpowiadam bo nie mam pojęcia jak to działa pod spodem, jedynie o nich słyszałem, ale podejrzewam że procesy wymieniają między sobą komunikaty przez sieć żeby uzyskać dostęp do zasobu innego węzła, jeśli takowych potrzebują, bo w systemie rozproszonym innego wyjścia za bardzo nie ma :)

1

Tensorflow-GPU chyba najlepsze narzędzie.
Jak robisz na własnych bibliotekach to masz kupę roboty żeby to zoptymalizować.

1
  1. W zasadzie tak, bo na tym opiera się, leciwa już, optymalizacja procesorów związana a pipeliningiem i superskalarnością. Procesor nie wykonuje instrukcji asemblera (czy nawet mikrokodu) atomowo. Każda instrukcja wymaga pewnych etapów, w takim najbardziej podstawowym ujęciu to będzie fetch-decode-execute. Pierwszy trik polega na tym że te operacje są wykonywane przez niezależne układy, więc procesor na raz może wykonywać wszystkie etapy. Więc np. bierze instrukcje pierwszą, robi fetch, następnie kiedy robi dla niej decode, może już robić fetch dla kolejnej instrukcji w tym samym czasie. Nic bardziej równoległego nie ma. Wszystko inne to tylko taka "symulacja" i przełączanie się procesora między zadanami.
  2. JVM potrafi zórnowleglić wykonanie na wiele rdzeni. Ale mimo wszystko masz dziesiątki procesów działajacych w systemie, setki wątków - to wszystko ogarnia scheduler systemu operacyjnego, który wydziela CPU dla tych procesów i wątków, dajac złudzenie jakby one wszystkie działały na raz.
  3. Można zdefiniować partycjonowanie danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1