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.
concurrency
parallelism
Abbafei
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
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ś
stdout
i 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.
źródło
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 ......
źródło
don't have the patience
jest to dokładniejsza ocena niżdon't have the mental capacity
chociaż. 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.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
źródło