Czy można stworzyć program jednowątkowy, który będzie używał wielu rdzeni?

12

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?

Chris
źródło
13
Nie, niemożliwe
Moab
5
Gdyby to było takie proste ..
Brendan Long
1
Co by było, gdyby istniał program, który „emulował” procesor (np. Vm?), Ale wziął procesor wielordzeniowy i emulował procesor jednordzeniowy o znacznie większej mocy obliczeniowej na wątek? Czy to jest możliwe?
schizoid04
Kto wtedy zarządza synchronizacją między wieloma wątkami, ponieważ kolejność ma znaczenie.
user36582,

Odpowiedzi:

16

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ść.

bwDraco
źródło
19
Warto również zauważyć, że niektórych aplikacji po prostu nie można przepisać, aby uwzględnić wiele rdzeni. Zależy to głównie od stopnia zrównoleglalności procesu. Prostym przykładem procesu nierównoległego może być rozmnażanie się człowieka: jedna kobieta może urodzić jedno dziecko w ciągu 9 miesięcy. Dziewięć kobiet może urodzić 9 dzieci w ciągu 9 miesięcy, ale nie można wykorzystać 9 kobiet do wyprodukowania jednego dziecka w ciągu jednego miesiąca.
AndrejaKo
1
Zasadniczo można napisać program do analizy innego programu i spróbować go zrównoleglić. To powiedziawszy, nawet bardzo ograniczone „łatwe” wersje tego problemu generują doktorat. rozprawy z ostatnich kilku pokoleń i postęp był powolny. Cały problem może równie dobrze być AI-zupełny.
dmckee --- były moderator kociak
Świetnie, dziękuję wam wszystkim, sprawiliście, że podoba mi się przykład kobiet i narodzin, szczególnie, gdy mówicie o produkcji: D
Chris
co jeśli program ma kilka niezależnych operacji matematycznych, które są później używane dla siebie nawzajem? może drugi wątek może przeanalizować program, hmm, nie wiem co mówię. Jeśli wątek mógłby przeanalizować zestaw. „Wykonaj tutaj kosztowną operację, a następnie wykonaj drugą kosztowną operację na tym, że pierwsza droga operacja nie dotyka” OK, umieszczę jedną kosztowną operację na jednym wątku, jeden na drugim, a następnie zsynchronizuję je z powrotem w głównym wątku. Podejrzewam, że cały program musiałby zostać wstępnie przeanalizowany, aby zidentyfikować niezależne kosztowne operacje.
CausingUnderflowsEverwhere 17.09.16
13

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.


źródło
2

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.

Paul A. Clayton
źródło
0

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.

użytkownik36582
źródło