Czy darmowy obiad się skończył? [Zamknięte]

12

W swoim słynnym artykule The Free Lunch Is Over z 2005 roku Herb Sutter przewidywał równoczesną rewolucję programistyczną tak dużą, jak rewolucja obiektowa. Czy ta rewolucja naprawdę wydarzyła się w latach 2005 - 2013?


Kluczowe punkty w artykule:

  • Producentom procesorów zabrakło miejsca na większość tradycyjnych metod zwiększania wydajności procesora. Zamiast zwiększać prędkości taktowania, zamiast tego przechodzą na architekturę hyperthreading i multi-core.

  • Aplikacje będą musiały być coraz bardziej współbieżne, jeśli chcą w pełni wykorzystać wzrost przepustowości procesora.

  • „Och, wydajność nie ma tak wielkiego znaczenia, komputery po prostu stają się coraz szybsze” stwierdzenie będzie błędne.

  • Optymalizacja wydajności i wydajności będzie coraz ważniejsza. Te języki, które już wymagają intensywnej optymalizacji, znajdą nowe życie; ci, którzy nie będą musieli znaleźć sposobów na konkurowanie i stać się bardziej wydajnymi i optymalizującymi. Oczekuj długoterminowego wzrostu zapotrzebowania na języki i systemy zorientowane na wydajność.

  • Języki i systemy programowania będą coraz częściej zmuszane do radzenia sobie z współbieżnością. Desperacko potrzebujemy modelu programowania wyższego poziomu dla współbieżności niż dzisiejsze języki.

cpp
źródło
15
Ile rdzeni ma Twój telefon?
Matt D
6
Moja Nokia 2700 ma jeden rdzeń.
CPP
5
@MattD Przepraszamy, ale dlaczego „czas na aktualizację” i co ma z tym wspólnego liczba rdzeni telefonu cpp? Skąd wiesz, że Nokia 2700 nie wystarcza na jego potrzeby?
Andres F.
2
Będę zapisywał, mówiąc całkowicie nienaukową nauką, że nastąpiła taka rewolucja po stronie sprzętowej rzeczy, ale rewolucja programowa była wyjątkowo powolna. Uzyskanie wysokiej jakości współbieżnych narzędzi dla wszystkich programistów jest wciąż trudnym przedsięwzięciem, a współbieżność nadal jest czymś, co wprawia w osłupienie nawet doświadczonych programistów równoległych w trudny do odtworzenia sposób.
Jesse C. Slicer
2
Chciałbym tylko zaznaczyć, że tylko dlatego, że harmonogram predykcji jest zły, niekoniecznie sprawia, że ​​prognozy są błędne. Jest oczywiste, że kluczowe punkty, które wymieniłeś powyżej, nie uzyskały sugerowanej ważności, ale były kroki w kierunku każdego z tych punktów. Powiedziałbym więc, że powyższe prognozy się sprawdzą, to tylko pytanie, kiedy. KIEDY będzie, kiedy stanie się wymogiem, a nie tylko pragnieniem. Wiedząc, kiedy ten próg zostanie przekroczony, dlaczego przewidywanie, kiedy jest takie trudne.
Dunk

Odpowiedzi:

23

Tak, ale to zależy.

Nie można oczekiwać, że napisze się niebanalne , wysokowydajne oprogramowanie bez korzystania z równoległego sprzętu i stosowania współbieżności jako techniki strukturyzacji programu. Ale większość oprogramowania jest zarówno trywialna, jak i niekrytyczna pod względem wydajności. Aplikacja internetowa nie robi wielkiego kryzysu, a aplikacje CRUD nie mają takich ograniczeń, jak ograniczenia czasowe niektórych programów symulacyjnych i medycznych.

W szczególności twórcy gier muszą się tym przejmować, ponieważ gry są najczęściej spotykanym rodzajem aplikacji z miękkimi wymaganiami w czasie rzeczywistym. Problem jest istotny w przypadku telefonu komórkowego, w którym chcesz wycisnąć jak najwięcej mocy obliczeniowej i renderowania ze zintegrowanego układu z dwoma rdzeniami procesora i procesorem graficznym o niskiej mocy. To kolejny powód, dla którego tak wielu programistów patrzy na Haskell i czeka na dojrzewanie języków takich jak Rust - chcemy bezpieczeństwa i wydajności na nowoczesnym sprzęcie.

Od 2005 roku zdobyliśmy nowe i ulepszone narzędzia, takie jak OpenCL, CUDA, OpenMP i zestawy instrukcji wektorowych do pracy z współbieżnością i równoległością danych w ustalonych językach. Jednak względni nowoprzybyli są projektowani od samego początku, aby robić o wiele więcej interesujących rzeczy przy jednoczesnej współpracy.

Współbieżne środowisko uruchomieniowe Haskell pozwala językowi zapewnić bogate wsparcie dla lekkich równoległości (iskier) i abstrakcji współbieżności (wątki, kanały i wspólne zmienne odniesienia). Go i Rust oferują również lekkie zadania, Go za pomocą kanałów i Rust za pomocą przekazywania wiadomości.

Systemy te oferują bezpieczeństwo pamięci, wydajne środowiska uruchomieniowe oraz ochronę statyczną przed niektórymi rodzajami wyścigów. Domyślnie niezmienność Haskell i Rust znacznie ułatwia zarządzanie współbieżnością. Erlang został robi to już w latach 80., ale potrzeby oprogramowania i naszej wiedzy o tym, jak projektować systemy programistyczne również poprawie od-dzięki Bogu.

Wreszcie, wiele istniejących języków - nie będę wymieniać nazwisk - jest gotowych odrzucić jako wiarygodne opcje pisania nowego oprogramowania. Ich obciążenia związane ze złożonością i słabymi abstrakcjami współbieżności sprawiają, że nie nadają się one do rozważań na temat nowoczesnych aplikacji. Po prostu czekamy na dojrzałe alternatywy.

Jon Purdy
źródło
2
Nie jestem pewien co do spadku niektórych języków, mam nadzieję, że zobaczymy kod napisany z większym naciskiem na minimalizowanie zależności niż cokolwiek innego. W końcu to nie wina, ale sposób, w jaki go używasz. A „nisko wiszący owoc” jego użycia nie jest już zgodny z wielowątkowością / współbieżnością.
Matt D
6
@MattD: Zarówno sposób używania języka, jak i sam język mogą być winne. Powiedz, że twój program jest zły. To ty źle to napisałeś, ale język niekoniecznie pomógł ci napisać to poprawnie , a to jest równie ważne.
Jon Purdy,
6

Oto kilka punktów danych; sam zdecyduj, czy liczy się to jako rewolucja.

Sprzęt równoległy

Około 2005 r. Zarówno Intel, jak i AMD zaczynają masowo produkować 2-rdzeniowe procesory do komputerów stacjonarnych x86 (Pentium D i Athlon 64), z zegarem o częstotliwości około 3 GHz.

W 2006 roku wypuszczono PlayStation 3 z procesorem Cell z rdzeniami 8 + 1 przy 3,2 GHz.

W 2006 roku ukazała się seria GeForce 8. Składa się z dużej liczby (~ 100) „procesorów strumieniowych” ogólnego zastosowania, w przeciwieństwie do jednostek specyficznych dla grafiki. Około 2007 r. Wydana została specyfikacja CUDA 1.0, umożliwiająca wykonywanie niektórych obliczeń ogólnego zastosowania na sprzężeniu masowo równoległym NVidia.

Od tego czasu tendencje trwały.

Powiedzmy, że teraz w 2013 r. Zarówno Intel, jak i AMD oferują 4, 8 i 16-rdzeniowe procesory o taktowaniu nieco powyżej zaledwie 4 GHz. Dwurdzeniowe i czterordzeniowe konstrukcje są wspólne dla urządzeń o mniejszej mocy, takich jak laptopy i smartfony.

Wszystko to jest masowo produkowanym, codziennym sprzętem komputerowym klasy konsumenckiej.

Oprogramowanie

CUDA został wydany w 2007 r., A następnie OpenCL w 2008 r., Co pozwala na stosowanie masowo równoległych układów GPU w obliczeniach ogólnych (nie graficznych). Model staje się popularny; wiele firm hostingowych (np. Amazon) oferuje procesory graficzne do ogólnych zadań obliczeniowych.

Go został wydany w 2009 roku, zawiera bardzo tanie wątki zapobiegawcze („goroutines”) i pozwala na wydajne wyrażanie wysoce współbieżnych algorytmów.

Zestaw narzędzi Akka został wydany dla Javy i Scali w 2009 roku, umożliwiając współbieżność aktorów.

Erlang (bardzo współbieżny język) odnotowuje pewien wzrost użycia.

Współbieżność a równoległość

Zauważ, że aby korzystać z równoległego sprzętu, niekoniecznie potrzebna jest współbieżność oprogramowania , to znaczy żonglowanie wątkami wykonania w obliczeniach. Wiele problemów jest rozwiązywanych przez równoległe , nie wchodzące w interakcje procesy, w których każdy proces jest tradycyjnym programem sekwencyjnym.

Przetwarzanie równoległe może wykorzystywać bardziej tradycyjne języki i struktury równoległe, takie jak redukcja map lub MPC lub OpenMP. W przypadku takich struktur obecność wielu rdzeni na tym samym krysztale procesora nie różni się koncepcyjnie od posiadania większej liczby procesorów w klastrze; różnica polega głównie na prędkości.

Do tej pory brak darmowego lunchu

Najwyższe prędkości wciąż utrzymują się na poziomie około 5 GHz. Przy widocznych lepszych technologiach, takich jak tranzystory grafenowe, częstotliwości mogą ponownie wzrosnąć w przyszłości, ale nie bardzo szybko.

9000
źródło