Tytuł mówi wszystko: czy istnieje sposób, aby starszy program został zaprojektowany tak, aby korzystał z jednego rdzenia procesora i korzystał z wielu rdzeni procesora?
Tytuł mówi wszystko: czy istnieje sposób, aby starszy program został zaprojektowany tak, aby korzystał z jednego rdzenia procesora i korzystał z wielu rdzeni procesora?
Odpowiedzi:
Niestety, starszy program napisany dla jednego procesora nie może być zmuszony do używania wielu rdzeni procesora. Korzystanie z wielu rdzeni procesora wymaga wielu wątków, które muszą się ze sobą komunikować, zapewniając jednocześnie, że nie wystąpią warunki wyścigu i inne problemy. Nie można zmusić starszej aplikacji do korzystania z więcej niż rdzenia procesora, chyba że zostanie to przepisane, i tylko wtedy, gdy charakter aplikacji pozwala na równoległość.
Jaki jest twój cel? Zwiększona wydajność? Niestety aplikacje, które zostały zaprojektowane tak, aby korzystały tylko z jednego rdzenia, nie wykorzystają więcej. O to właśnie chodzi w tych „wielowątkowych” aplikacjach.
Istnieją co najmniej trzy techniki wykorzystania wielu procesorów w programie zaprojektowanym do korzystania z jednego rdzenia. Najprostszą z tych technik jest użycie bibliotek i kodu systemowego, który wykorzystuje wiele rdzeni lub może wykonywać przynajmniej częściowo równolegle z kodem aplikacji. Wyrzucanie elementów bezużytecznych to przykład funkcjonalności, którą można zrównoleglić i która może być możliwa równolegle z wykonywaniem aplikacji. Nawet bez automatycznego zarządzania pamięcią istnieje pewien potencjał równoległości w funkcjach zwalniania pamięci, ponieważ alokator pamięci może mieć trochę pracy poza zwykłym oznaczeniem części pamięci jako dostępnej.
Drugą techniką jest tłumaczenie binarne. Chociaż można to uznać za „przepisywanie aplikacji”, odbywa się to przez oprogramowanie i bez dostępu do kodu źródłowego. Wydaje się, że tworzenie równoległości na poziomie wątków nie było głównym celem większości badań i rozwoju przy użyciu translacji binarnej (która często dotyczy uruchamiania starszego kodu na innym ISA, wykorzystywania rozszerzeń ISA lub optymalizacji pod kątem konkretnej mikroarchitekty oraz wykorzystywania informacji dynamicznych w celu zapewnienia wyższych optymalizacja kierowana profilem jakości), ale potencjał jest oczywisty.
Trzecią techniką jest spekulacyjna wielowątkowość. Obecnie żadne procesory (o których wiem) nie obsługują zarządzanego sprzętowo wielowątkowości. Jednak wraz z wprowadzeniem sprzętowej pamięci transakcyjnej posiadanie implementacji systemu wykonawczego staje się nieco bardziej praktyczne, ponieważ HTM może być wykorzystywany do wykrywania konfliktów w użyciu pamięci. Zarządzana programowo wielowątkowość spekulacyjna zazwyczaj wymaga tłumaczenia binarnego, ale jej spekulatywny charakter uzasadnia rozważenie odrębnej techniki.
Praktyczność tych technik jest ograniczona kosztami związanymi z istniejącymi systemami (w tym kosztem komunikacji między wątkami i wątkami spawnującymi), ograniczoną równoległością, którą mogą wykorzystać, oraz ograniczonym zwrotem z inwestycji (ważne zastosowania, które mogą być korzystne prawdopodobnie zostaną przepisane równolegle, wiele aplikacji skorzystałoby z takich technik stosunkowo niewiele, jeśli w ogóle, (szczególnie z limitami mocy / temperatury pozwalającymi na pracę jednego rdzenia z większą częstotliwością niż wiele rdzeni), a koszty opracowania są znaczne). Jednak te techniki robić istnieje i jest to teoretycznie możliwe, aby korzystać z wielu rdzeni z aplikacją przeznaczoną do wykorzystania pojedynczego rdzenia.
Nie, nie może być. Program jest wyraźnie napisany, aby używać wielu rdzeni. Wykonanie pracy w wielu rdzeniach nie jest trywialne. Wymaga synchronizacji wszystkich wątków. Jak jeden rzuca piłkę, drugi łapie, jeden poleruje piłkę, jeden czyści, jeden sprawdza piłkę, czy ma w niej dobrą ilość powietrza. Teraz wyobraź sobie, że każda postać działa w wątku niezależnie od siebie. Ktoś próbuje złapać piłkę, gdy nie jest rzucona. Albo ktoś próbuje dopracować piłkę podczas gry. Lub dwie postacie próbujące złapać i rzucić piłkę jednocześnie. Jest tak wiele sposobów na awarię. Dlatego programiści muszą dokładnie przeprojektować aplikację z jednym rdzeniem, aby mogła ona korzystać z wielu rdzeni.