Szybsze programy dzięki naukowcom?
Programowanie komputerów rzadko kojarzy się z badaniami naukowymi, choć przecież informatyka również jest nauką. I to nauką mającą wyjątkowo duży wpływ na nasze życie, życie nie tylko posiadaczy komputerów. Za to każdy posiadacz komputera chciałby, żeby programy chodziły mu szybciej. Ba, to trzeba kupić szybszy komputer - powie niejeden. A czy nie da się przyspieszyć bez płacenia?
Sztuka projektowania komputerów zaczęła w ostatnich latach wchodzić w ślepą uliczkę. Dalsze przyspieszanie procesorów staje się coraz trudniejsze. Wyjściem z tej sytuacji miało być postawienie na układy wielordzeniowe, czyli - mówiąc prosto - upakowanie kilku działających równocześnie procesorów w jeden układ scalony. Nie jest to jednak panaceum. Aby osiągnąć przyspieszenie, działający program musi być podzielony na kilka osobnych części, tzw. wątków, z których każdy mógłby dostać osobny rdzeń i działać w tym samym czasie. Przykładowo, kiedy oglądamy film, jeden wątek może odpowiadać za wyświetlanie obrazu, drugi za odtwarzanie dźwięku, trzeci za pokazywanie napisów, itd. Kiedy procesor jest pojedynczy, robi to wszystko jednocześnie sam, a tak naprawdę na zmianę, tylko bardzo szybko. Kiedy rdzeni procesora jest więcej, rozdzielają wątki między siebie i wykonują je naprawdę jednocześnie - równolegle, jak to się nazywa - pilnując tylko, żeby żaden nie wyprzedził reszty.
Takie projektowanie programów, żeby mogły dzielić się na wątki pracujące równolegle, nazywa się zrównoleglaniem (lub z angielska paralelizacją). Ponieważ wielordzeniowe procesory to w miarę nowy wynalazek, starsze programy trzeba napisać na nowo, żeby mogły skorzystać z dobrodziejstwa. Współczesne programy są coraz częściej tworzone wielowątkowo. Ale nie zawsze jest to możliwe. Znaczna część programów nie może być łatwo podzielona na osobne zadania. Ich działanie można porównać do taśmy montażowej: każda operacja jest skutkiem poprzedniej i powoduje następną. Są tak powiązane, że nie można ich rozdzielić. Tak pracują na przykład edytory tekstu, przeglądarki internetowe, czyli programy, których używamy na co dzień. I co nam wtedy po nowoczesnym, choćby ośmiordzeniowym procesorze, skoro program i tak pracuje tylko na jednym? Pozostała moc obliczeniowa po prostu się marnuje.
Problemem zajęli się naukowcy z NCSU - Uniwersytetu Stanowego Północnej Karoliny w USA. Przyjrzeli się oni głębiej działaniu programowej „taśmy montażowej". Każda operacja dzieli się na dwa zasadnicze kroki: program najpierw przydziela sobie odpowiednią ilość pamięci, następnie wykonuje obliczenia, które potem w niej zapisuje. I znów zajmuje się zarządzaniem pamięcią: zwalnia tę już niepotrzebną dla innych programów, lub przydziela sobie kolejną potrzebną porcję. Do tej pory traktowano te kolejne kroki łącznie. Uniwersyteccy inżynierowie postanowili rozbić te nierozłączne do tej pory elementy i wydzielili zarządzanie pamięcią do osobnego wątku.
W nowym podejściu, kiedy wątek obliczeniowy potrzebuje nowej pamięci, lub może zwolnić aktualnie używaną, informuje po prostu drugi wątek - zarządzający pamięcią - co ten ma zrobić, a po skończonej operacji dostaje wiadomość zwrotną i kontynuuje swoją pracę. Jak tłumaczy dr Yan Solihin, kierujący tym projektem, pozwala to na przyspieszenie działania programów o około 20%. Z pozoru nie jest to wiele, ale to przełomowe podejście do tworzenia programów otwiera nowe możliwości. Przykładowo, wątek zarządzający pamięcią może wykonywać dodatkowe operacje, jak wykrywanie anomalii w działaniu programu, czy potencjalnie niebezpiecznych zachowań. Przy zwykłym programowaniu takie funkcje za bardzo opóźniałyby działający program, więc się ich nie stosowało. Przerzucenie ich do drugiego wątku sprawi, że będą się one wykonywać w „wolnym czasie", bez spowalniania i denerwowania użytkownika. Być może dzięki temu w niedalekiej przyszłości nasze komputery zyskają na stabilności i bezpieczeństwie.
Projekt finansowała National Science Foundation (Narodowa Fundacja Naukowa). Współautorami pracy, która zostanie zaprezentowana 21 kwietnia na międzynarodowym sympozjum w Atlancie, byli Devesh Tiwari, Sanghoon Lee i James Tuck.
Komentarze (7)
krzabr, 7 kwietnia 2010, 14:01
Ciekawe kiedy tylko powstana odpowiednie kompilatory/interpretery/maszyny wirtualne ktore zaczna wykorzystywac ta nowa mozliwosc .
Michał Wolak, 7 kwietnia 2010, 14:18
Nooo... Taki interpreter to byłoby coś... Wyobraźmy sobie BASIC w takiej architekturze... ))
Jurgi, 7 kwietnia 2010, 16:02
Właśnie, nowy kompilator pozwoliłby na przyspieszenie już istniejących programów. Z drugiej strony, na procesorach jednordzeniowych, a tych jest jeszcze sporo, takie programy musiałyby zwolnić.
A BASIC… ciekawe, nie przyszło mi to do głowy. Faktycznie, w przypadku języków intepretowanych taka technika (i podobne) chyba mogłyby dać jeszcze większego kopa. A może są już interpretery, w których np. osobny wątek interpretuje, osobny wykonuje?
Michał Wolak, 7 kwietnia 2010, 16:54
z tym BASICiem to taki żart miał być... do śmichu... ale z drugiej strony, to na upartego można i tak.
megawebmaster, 7 kwietnia 2010, 21:33
@Jurgi - nie, nie zwolniłyby. Zwyczajnie obydwa wątki byłyby wykonywane przez jeden procesor na przemian, ewentualnie jeden byłyby zawieszony do czasu wywołania (ten do zarządzania pamięcią). Właściwie w obu przypadkach by delikatnie przyspieszyło, ale dla wielowątkowych procesorów bardzo wyraźnie (podkreślam: wielowątkowych, np. Pentium 4 już oferowało Hyper Threading, dzisiejszy Simultaneous Multi Threading)
Jurgi, 7 kwietnia 2010, 21:44
Hm, a sama komunikacja między wątkami nie daje narzutu? Oraz konieczność zarządzania dodatkowym wątkiem przez system?
wilk, 6 lipca 2010, 22:51
To niezupełnie tak wygląda. Jedynie jeśli jako "operację" pojmujemy de facto makro-operację, czyli na przykład wspomniane wideo, audio i napisy. Jest to zrównoleglanie zadań. Zrównolegla się tak naprawdę też na poziomie przetwarzania danych, czyli niezależne części kodu lub pętle programu, tak by czasochłonne obliczenia rozłożyć na kilka wątków i co za tym idzie - procesorów. Dzięki temu samo wspomniane dekodowanie obrazu można rozłożyć na kilka wątków. Można jeszcze wspomnieć o superskalarności (równolegle przetwarzanie instrukcji), ale to już domena optymalizacji.