Dlaczego niejawna równoległość / współbieżność nie jest bardziej rozpowszechniona? [Zamknięte]


13

Domniemana równoległość ^ może odciążyć wielu programistów, nakładając ją na komputer. Więc ... dlaczego nie jest obecnie bardziej rozpowszechniony?


^ Niejawna równoległość polega na tym, aby komputer mógł sam dowiedzieć się, jak zrobić więcej niż jedną rzecz na raz, zamiast programisty, który musi wykonywać tę pracę za pomocą wątków i tym podobnych.


Sprawdź język programowania parasail, wydaje się, że są jedynymi, którzy próbują ukrytej równoległości forge.open-do.org/plugins/moinmoin/parasail

Odpowiedzi:


11

Ponieważ z kilkoma wyjątkami (Haskell) kompilator nie może rozpakować pętli. Problem polega na tym, że każda iteracja w pętli może modyfikować stan globalny. Więc robienie tego w innej kolejności może spowodować uszkodzenie. W haskell możesz liczyć na to, że funkcja jest czysta, co oznacza, że ​​nie odczytuje ani nie zmienia stanu globalnego, więc można ją wykonać w dowolnej kolejności.

Prawdziwy problem polega na tym, że z kilkoma wyjątkami, jak dobrze robić współbieżność, jest nadal bardzo otwartym problemem. Wydaje się, że społeczności Erlang i Haskell mają się całkiem dobrze, ale jest jeszcze długa droga, zanim naprawdę zrozumiemy, jak zaprogramować system N-core dla dużych N.


1
W schemacie istnieje kilka pętli, które wyraźnie nie gwarantują zamówienia.
Javier

Fajnie, że nie wiedziałem o schemacie
Zachary K

5

Większość używanych przez nas języków programowania pojawiła się w czasie, gdy programowanie jednowątkowe i interakcja jednego użytkownika są najczęściej używane w wielu aplikacjach (np. Samodzielne aplikacje komputerowe). Wraz z rozwojem aplikacji internetowych, przetwarzania w chmurze i aplikacji dla wielu użytkowników potrzebujemy teraz więcej aplikacji wielowątkowych.

Starsze języki programowania starają się powoli wspierać funkcje wielowątkowe z samego języka (tak jak java dodała java.util.concurrent).

Nowe języki, które pojawią się w przyszłości, będą miały lepszą wbudowaną obsługę wątków i współbieżności.


4

Oprócz punktów wymienionych w innych odpowiedziach (trudno udowodnić, że operacje są niezależne, a programiści myślą poważnie), należy wziąć pod uwagę trzeci czynnik: koszt równoległości.

Prawda jest taka, że ​​równoległość nici wiąże się z bardzo dużymi kosztami:

  • Tworzenie wątków jest bardzo kosztowne: dla jądra rozpoczęcie wątku jest prawie takie samo jak rozpoczęcie procesu. Nie jestem pewien co do dokładnych kosztów, ale uważam, że jest to rzędu dziesięciu mikrosekund.

  • Komunikacja wątków za pośrednictwem muteksów jest droga: zazwyczaj wymaga to wywołania systemowego z każdej strony, prawdopodobnie uśpienia wątku i wznowienia go, co powoduje opóźnienia, a także chłodzenie pamięci podręcznej i opróżnianie TLB. Średnio pobranie i wydanie muteksu kosztuje około jednej mikrosekundy.

Jak na razie dobrze. Dlaczego jest to problem z ukrytą równoległością? Ponieważ niejawna równoległość jest najłatwiejsza do udowodnienia w małych skalach. Jedną rzeczą jest udowodnienie, że dwie iteracje prostej pętli są od siebie niezależne, zupełnie inną rzeczą jest udowodnienie, że drukowanie czegoś stdouti wysyłanie zapytania do bazy danych są od siebie niezależne i mogą być wykonywane równolegle ( proces bazy danych może być po drugiej stronie potoku!).

Oznacza to, że domniemana równoległość, którą program komputerowy może udowodnić, jest prawdopodobnie niewykonalna, ponieważ koszty równoległości są większe niż przewaga przetwarzania równoległego. Z drugiej strony, równoległość na dużą skalę, która może naprawdę przyspieszyć aplikację, nie jest możliwa do udowodnienia dla kompilatora. Pomyśl tylko, ile pracy może wykonać procesor w ciągu mikrosekundy. Teraz, jeśli równoległość ma być szybsza niż program szeregowy, program równoległy musi być w stanie utrzymać wszystkie procesory zajęte przez kilka mikrosekund między dwoma wywołaniami mutex. Wymaga to naprawdę gruboziarnistej równoległości, co jest prawie niemożliwe do udowodnienia automatycznie.

Wreszcie, żadna reguła bez wyjątku: Wykorzystanie niejawnej równoległości działa, gdy nie są zaangażowane żadne wątki, co ma miejsce w przypadku wektoryzacji kodu (przy użyciu zestawów instrukcji SIMD, takich jak AVX, Altivec itp.). To rzeczywiście działa najlepiej w przypadku paralelizmu na małą skalę, który jest stosunkowo łatwy do udowodnienia.


0

Programiści myślą poważnie, a obecne języki są zbudowane do obsługi tego modelu. Z wyjątkiem języków marginalnych, takich jak Haskell Erlang itp., Języki (powstrzymuję się od używania przymiotnika „nowoczesny”) są zasadniczo zestawem wysokiego poziomu, w którym wciąż mówimy komputerowi, co robić, kiedy to robić i jak to zrobić. Dopóki nie będziemy mieli systemu echa, w którym powiemy komputerowi, jaki wynik jest możliwy, nie mamy zdolności umysłowych, jako programistów, do pełnego wykorzystania możliwości wielowątkowości.

tzn. to nie jest naturalne ......


Programiści myślą, jak uczono ich myślenia, tak jak programują w taki sposób, w jaki ich język programowania zachęca ich do programowania. Jeśli programista nie narażać się do tzw pobocznych języków, nigdy nie dowie się, że istnieją inne sposoby rozumowania o problemach. Myślę, że dlatego Siedem języków w siedmiu tygodniach jest wysoko na liście osób polecanych.
Mark Booth,

Grzywka Perhap była niewłaściwym słowem - miałem na myśli języki, które nie są powszechnie używane w aplikacjach komercyjnych (tj. Nie C ++ ani Java).
mattnz

1
Jednak podtrzymuję moje twierdzenie (bez mojej własnej opinii), że programiści, będąc ludźmi, nie mają metalowej mocy, aby naprawdę „uzyskać” wielowątkowość i masywny parrallisum. Nie jest ludzką naturą wykonywanie więcej niż jednego zadania jednocześnie. Każda książka na temat zarządzania czasem promuje koncepcje rozpoczęcia czegoś, dokończ go, a następnie zrób następną rzecz, ponieważ tak właśnie jesteśmy połączeni. Aby skutecznie i skutecznie korzystać z tych paradygmatów, potrzebujemy ogromnego wsparcia narzędziowego, które obecnie nie jest dostępne. Nieliczni to „rozumieją” i muszą opracować te narzędzia.
mattnz

1
Myślę, że don't have the patiencejest to dokładniejsza ocena niż don't have the mental capacitychociaż. W trakcie mojej kariery widziałem znacznie więcej leniwych programistów niż głupich . Miałem szczęście, podczas pierwszego roku studiów nauczyłem się programowania funkcjonalnego i drobnoziarnistego programowania równoległego obok procedur i OO. Podejrzewam, że wielu programistów nie miało tyle szczęścia, a ich procesy myślowe zostały w efekcie bardzo proste.
Mark Booth

0

Transakcje muszą być ACID, więc programista zwykle myśli o jednym wątku.

Języki i platformy muszą chronić programistę przed współbieżnością, na ile mogą sobie pozwolić

A współbieżność nie jest tak łatwa do przetestowania jak sama funkcjonalność, więc programiści zwykle odchodzą od tych problemów, a nawet nie myśląc o obsłudze współbieżności, co jest błędem

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.