Porównywanie współbieżności środowiska wykonawczego z innymi modelami współbieżności
W tym dokumencie opisano różnice między funkcjami i modelami programowania środowiska uruchomieniowego współbieżności i innymi technologiami. Zrozumienie, w jaki sposób zalety środowiska uruchomieniowego współbieżności porównują się z korzyściami innych modeli programowania, możesz wybrać technologię, która najlepiej spełnia wymagania aplikacji.
Jeśli obecnie używasz innego modelu programowania, takiego jak pula wątków systemu Windows lub OpenMP, istnieją sytuacje, w których można przeprowadzić migrację do środowiska uruchomieniowego współbieżności. Na przykład temat Migrowanie z programu OpenMP do środowiska uruchomieniowego współbieżności opisuje, kiedy można przeprowadzić migrację z protokołu OpenMP do środowiska uruchomieniowego współbieżności. Jeśli jednak wydajność aplikacji i bieżąca obsługa debugowania są zadowalające, migracja nie jest wymagana.
Możesz użyć funkcji i korzyści związanych z produktywnością środowiska uruchomieniowego współbieżności, aby uzupełnić istniejącą aplikację, która korzysta z innego modelu współbieżności. Środowisko uruchomieniowe współbieżności nie może zagwarantować równoważenia obciążenia, gdy wiele harmonogramów zadań rywalizuje o te same zasoby obliczeniowe. Jednak jeśli obciążenia nie nakładają się na siebie, efekt ten jest minimalny.
Sekcje
Porównywanie planowania wyprzedzania z harmonogramem spółdzielczym
Porównanie środowiska uruchomieniowego współbieżności z interfejsem API systemu Windows
Porównywanie środowiska uruchomieniowego współbieżności z usługą OpenMP
Porównywanie planowania wyprzedzania z harmonogramem spółdzielczym
Model wyprzedzania i modele planowania współpracy to dwa typowe sposoby umożliwienia wielu zadań udostępniania zasobów obliczeniowych, na przykład procesorów lub wątków sprzętowych.
Planowanie z góry i współpracy
Planowanie wyprzedzające to mechanizm oparty na priorytetach, który zapewnia każdemu zadaniu wyłączny dostęp do zasobu obliczeniowego w danym okresie, a następnie przełącza się do innego zadania. Planowanie wstępne jest powszechne w systemach operacyjnych wielozadaniowych, takich jak Windows. Planowanie współpracy to mechanizm, który zapewnia każdemu zadaniu wyłączny dostęp do zasobu obliczeniowego do momentu zakończenia zadania lub do momentu uzyskania dostępu do zasobu przez zadanie. Środowisko uruchomieniowe współbieżności używa harmonogramu współpracy wraz z harmonogramem wstępnym systemu operacyjnego w celu osiągnięcia maksymalnego użycia zasobów przetwarzania.
Różnice między preemptive i spółdzielczymi harmonogramami
Wywłasze harmonogramy mają na celu zapewnienie wielu wątków równego dostępu do zasobów obliczeniowych w celu zapewnienia postępu każdego wątku. Na komputerach z wieloma zasobami obliczeniowymi zapewnienie sprawiedliwego dostępu staje się mniej problematyczne; jednak zapewnienie efektywnego wykorzystania zasobów staje się bardziej problematyczne.
Harmonogram trybu jądra wymaga, aby kod aplikacji polegał na systemie operacyjnym w celu podejmowania decyzji dotyczących planowania. Z drugiej strony, harmonogram współpracy w trybie użytkownika umożliwia kodowi aplikacji podejmowanie własnych decyzji dotyczących planowania. Ponieważ planowanie współpracy umożliwia wielu decyzji dotyczących planowania, które mają być podejmowane przez aplikację, zmniejsza znaczną część obciążenia związanego z synchronizacją w trybie jądra. Harmonogram współpracy zwykle odchodź od planowania decyzji dotyczących jądra systemu operacyjnego, gdy nie ma innej pracy do zaplanowania. Harmonogram współpracy również odchyli się do harmonogramu systemu operacyjnego, gdy istnieje operacja blokująca, która jest przekazywana do jądra, ale ta operacja nie jest komunikowana z harmonogramem trybu użytkownika.
Planowanie i efektywność współpracy
W przypadku harmonogramu wyprzedzania wszystkie prace, które mają ten sam poziom priorytetu, są równe. Harmonogram wyprzedzający zwykle planuje wątki w kolejności, w jakiej są tworzone. Ponadto harmonogram wyprzedzania daje każdemu wątkowi wycinek czasu w sposób okrężny na podstawie priorytetu wątku. Mimo że ten mechanizm zapewnia sprawiedliwość (każdy wątek wykonuje postęp w przyszłości), wiąże się to z pewnym kosztem wydajności. Na przykład wiele algorytmów intensywnie korzystających z obliczeń nie wymaga sprawiedliwości. Zamiast tego ważne jest, aby powiązane zadania były wykonywane w najmniej ogólnym czasie. Planowanie współpracy umożliwia aplikacji wydajniejsze planowanie pracy. Rozważmy na przykład aplikację, która ma wiele wątków. Planowanie wątków, które nie współużytkują zasobów w celu jednoczesnego uruchamiania, może zmniejszyć obciążenie synchronizacji, a tym samym zwiększyć wydajność. Innym wydajnym sposobem planowania zadań jest uruchamianie potoków zadań (gdzie każde zadanie działa na danych wyjściowych poprzedniego), na tym samym procesorze, tak aby dane wejściowe każdego etapu potoku były już ładowane do pamięci podręcznej.
Używanie preemptive i spółdzielczego planowania razem
Harmonogram współpracy nie rozwiązuje wszystkich problemów z planowaniem. Na przykład zadania, które nie są dość zwracane do innych zadań, mogą wykorzystywać wszystkie dostępne zasoby obliczeniowe i uniemożliwiać wykonywanie innych zadań. Środowisko uruchomieniowe współbieżności wykorzystuje korzyści z wydajności planowania współpracy, aby uzupełnić gwarancje sprawiedliwości planowania z góry. Domyślnie środowisko uruchomieniowe współbieżności udostępnia harmonogram współpracy, który używa algorytmu kradzieży pracy do wydajnego dystrybuowania pracy między zasobami obliczeniowymi. Jednak harmonogram środowiska uruchomieniowego współbieżności opiera się również na harmonogramie wyprzedzania systemu operacyjnego, aby sprawiedliwie dystrybuować zasoby między aplikacjami. Możesz również tworzyć niestandardowe zasady harmonogramów i harmonogramów w aplikacjach w celu uzyskania precyzyjnej kontroli nad wykonywaniem wątków.
[Top]
Porównanie środowiska uruchomieniowego współbieżności z interfejsem API systemu Windows
Interfejs programowania aplikacji systemu Microsoft Windows, który jest zwykle określany jako interfejs API systemu Windows (i wcześniej znany jako Win32), udostępnia model programowania, który umożliwia współbieżność w aplikacjach. Środowisko uruchomieniowe współbieżności opiera się na interfejsie API systemu Windows, aby zapewnić dodatkowe modele programowania, które nie są dostępne w bazowym systemie operacyjnym.
Środowisko uruchomieniowe współbieżności opiera się na modelu wątku interfejsu API systemu Windows w celu wykonywania równoległych zadań. Korzysta również z funkcji zarządzania pamięcią interfejsu API systemu Windows i mechanizmów magazynu lokalnego wątku. W systemach Windows 7 i Windows Server 2008 R2 jest używana obsługa interfejsu API systemu Windows dla wątków i komputerów, które mają więcej niż 64 wątki sprzętowe. Środowisko uruchomieniowe współbieżności rozszerza model interfejsu API systemu Windows, udostępniając harmonogram zadań współpracy i algorytm kradzieży pracy w celu zmaksymalizowania wykorzystania zasobów obliczeniowych oraz przez włączenie wielu równoczesnych wystąpień harmonogramu.
Języki programowania
Interfejs API systemu Windows używa języka programowania C do uwidocznienia modelu programowania. Środowisko uruchomieniowe współbieżności udostępnia interfejs programowania C++, który korzysta z najnowszych funkcji w języku C++. Na przykład funkcje lambda zapewniają zwięzły, bezpieczny dla typów mechanizm definiowania równoległych funkcji pracy. Aby uzyskać więcej informacji na temat najnowszych funkcji języka C++ używanych przez środowisko uruchomieniowe współbieżności, zobacz Omówienie.
Wątki i pule wątków
Centralnym mechanizmem współbieżności w interfejsie API systemu Windows jest wątek. Zazwyczaj używasz funkcji CreateThread do tworzenia wątków. Mimo że wątki są stosunkowo łatwe do utworzenia i użycia, system operacyjny przydziela znaczną ilość czasu i innych zasobów do zarządzania nimi. Ponadto, mimo że każdy wątek ma gwarancję otrzymania tego samego czasu wykonywania co każdy inny wątek na tym samym poziomie priorytetu, skojarzone obciążenie wymaga utworzenia wystarczająco dużych zadań. W przypadku mniejszych lub bardziej precyzyjnych zadań obciążenie związane z współbieżnością może przewyższać korzyści wynikające z równoległego uruchamiania zadań.
Pule wątków to jeden ze sposobów zmniejszenia kosztów zarządzania wątkami. Niestandardowe pule wątków i implementacja puli wątków udostępniane przez interfejs API systemu Windows umożliwiają wydajne uruchamianie małych elementów roboczych równolegle. Pula wątków systemu Windows obsługuje elementy robocze w kolejce pierwszy na wyjęcie (FIFO). Każdy element roboczy jest uruchamiany w kolejności, w której został dodany do puli.
Środowisko uruchomieniowe współbieżności implementuje algorytm kradzieży pracy w celu rozszerzenia mechanizmu planowania FIFO. Algorytm przenosi zadania, które nie zostały jeszcze uruchomione do wątków, w których zabrakło elementów roboczych. Mimo że algorytm kradzieży pracy może równoważyć obciążenia, może również spowodować zmiana kolejności elementów roboczych. Ten proces zmiany kolejności może spowodować uruchomienie elementu roboczego w innej kolejności niż przesłano. Jest to przydatne w przypadku algorytmów cyklicznych, gdzie istnieje większe prawdopodobieństwo, że dane są współużytkowane między nowszymi zadaniami niż wśród starszych. Pierwsze uruchomienie nowych elementów oznacza mniej błędów pamięci podręcznej i prawdopodobnie mniej błędów strony.
Z perspektywy systemu operacyjnego kradzież pracy jest niesprawiedliwa. Jednak gdy aplikacja implementuje algorytm lub zadanie do równoległego uruchamiania, sprawiedliwość między zadaniami podrzędnymi nie zawsze ma znaczenia. To, co ma znaczenie, to jak szybko zakończy się ogólne zadanie. W przypadku innych algorytmów fiFO jest odpowiednią strategią planowania.
Zachowanie w różnych systemach operacyjnych
W systemach Windows XP i Windows Vista aplikacje korzystające ze środowiska uruchomieniowego współbieżności zachowują się podobnie, z tą różnicą, że wydajność sterty jest lepsza w systemie Windows Vista.
W systemach Windows 7 i Windows Server 2008 R2 system operacyjny dodatkowo obsługuje współbieżność i skalowalność. Na przykład te systemy operacyjne obsługują komputery, które mają więcej niż 64 wątki sprzętowe. Aby korzystać z tych nowych funkcji, należy zmodyfikować istniejącą aplikację korzystającą z interfejsu API systemu Windows. Jednak aplikacja korzystająca ze środowiska uruchomieniowego współbieżności automatycznie używa tych funkcji i nie wymaga modyfikacji.
[Top]
Porównywanie środowiska uruchomieniowego współbieżności z usługą OpenMP
Środowisko uruchomieniowe współbieżności umożliwia korzystanie z różnych modeli programowania. Te modele mogą się nakładać lub uzupełniać modele innych bibliotek. W tej sekcji porównaliśmy środowisko uruchomieniowe współbieżności do protokołu OpenMP.
Model programowania OpenMP jest definiowany przez otwarty standard i ma dobrze zdefiniowane powiązania z językami programowania Fortran i C/C++. Protokół OpenMP w wersjach 2.0 i 2.5 jest odpowiedni dla algorytmów równoległych, które są iteracyjne; oznacza to, że wykonują iterację równoległą na tablicy danych. Protokół OpenMP jest najbardziej wydajny, gdy stopień równoległości jest wstępnie określony i pasuje do dostępnych zasobów w systemie. Model OpenMP jest szczególnie dobrym rozwiązaniem w przypadku obliczeń o wysokiej wydajności, gdzie bardzo duże problemy obliczeniowe są dystrybuowane między zasoby przetwarzania jednego komputera. W tym scenariuszu środowisko sprzętowe jest znane, a deweloper może rozsądnie oczekiwać wyłącznego dostępu do zasobów obliczeniowych podczas wykonywania algorytmu.
Jednak inne, mniej ograniczone środowiska obliczeniowe mogą nie być dobrym dopasowaniem dla openMP. Na przykład problemy cykliczne (takie jak algorytm quicksort lub wyszukiwanie drzewa danych) są trudniejsze do zaimplementowania przy użyciu protokołu OpenMP. Środowisko uruchomieniowe współbieżności uzupełnia możliwości protokołu OpenMP, udostępniając bibliotekę równoległych wzorców (PPL) i bibliotekę agentów asynchronicznych. W przeciwieństwie do protokołu OpenMP środowisko uruchomieniowe współbieżności udostępnia dynamiczny harmonogram, który dostosowuje się do dostępnych zasobów i dostosowuje stopień równoległości w miarę zmiany obciążeń.
Wiele funkcji w środowisku uruchomieniowym współbieżności można rozszerzyć. Możesz również połączyć istniejące funkcje, aby tworzyć nowe. Ponieważ protokół OpenMP opiera się na dyrektywach kompilatora, nie można go łatwo rozszerzyć.
Aby uzyskać więcej informacji na temat porównywania środowiska uruchomieniowego współbieżności do protokołu OpenMP i sposobu migrowania istniejącego kodu OpenMP w celu korzystania ze środowiska uruchomieniowego współbieżności, zobacz Migrowanie ze środowiska OpenMP do środowiska uruchomieniowego współbieżności.
[Top]
Zobacz też
Środowisko uruchomieniowe współbieżności
Omówienie
Biblioteka równoległych wzorców (PLL)
Biblioteki agentów asynchronicznych
OpenMP