Co oznacza połączenie statyczne, dynamiczne i pojedyncze dynamiczne?

9

Używam Intel MKL dla BLAS i używam Intel MKL Link Line Advisor, aby uzyskać pomoc w zakresie opcji wiersza poleceń.

Doradca udostępnia opcje dla biblioteki statycznej, dynamicznej i pojedynczej biblioteki dynamicznej. Co oznaczają te terminy?

Było wiele postów na ten temat, ale wszystkie koncentrowały się na tworzeniu oprogramowania, a nie kodów naukowych / matematycznych. ( Ten był szczególnie przydatny)

  • W jaki sposób te warunki odnoszą się do przetwarzania równoległego?
  • Czy jedno jest „lepsze” od drugiego? (Wiem, że lepiej byłoby precyzyjniej zdefiniować, ale na razie nie wiem, jak to zrobić)
  • Co jest używane częściej i dlaczego?
  • Co programista musi wziąć pod uwagę podczas łączenia?
Śledztwo
źródło
Dla przypomnienia, jeśli go nie widziałeś, nowsze kompilatory Intela (myślę, że wersja 11 i nowsze) zapewniają -mklflagę, która powinna wyeliminować potrzebę korzystania z doradcy linii łącza w większości przypadków.
Aesin,
@Aein, zastanawiałem się. Czy to najbardziej optymalny sposób łączenia?
Inquest
Niestety nie wiem - tak naprawdę nie przeprowadziłem żadnych testów, a instrukcja nie zawiera żadnych szczegółów na temat tego, co robi ani jak łączy się z innymi opcjami. Jednak łączy statycznie MKL, jeśli go określisz, -statici dynamicznie łączy go, jeśli tego nie zrobisz. W każdym razie jest to zdecydowanie lepsze z punktu widzenia łatwości użytkowania.
Aesin,

Odpowiedzi:

14

Pojęcia łączenie statyczne i łączenie dynamiczne nie są bezpośrednio związane z obliczeniami równoległymi, chociaż od pewnego czasu wiadomo, że ładowanie dynamiczne (w przeciwieństwie do ładowania statycznie skompilowanego pliku wykonywalnego) nie skaluje się dobrze w sieciowych systemach plików z powodu dużego obciążenia ładowanie metadanych spowodowane przez dynamiczne ładowanie przeszukujące ścieżki ładowania dla bibliotek docelowych.

Trudno jest sformułować ogólne stwierdzenia, czy biblioteki statyczne czy dynamiczne są lepsze w obliczeniach o wysokiej wydajności. Z pewnością w przypadku większości aplikacji superkomputerowych jest to prostsze i preferowane jest łączenie statyczne. Dlaczego to? W bieżącej generacji superkomputerów zwykle działa tylko jedno zadanie na węzeł, co znacznie zmniejsza wszelkie korzyści wynikające ze zmniejszonego zużycia pamięci dzięki współdzielonym bibliotekom. Ponadto naukowe kody komputerowe zwykle nie są zbyt skomplikowane pod względem funkcji językowych lub projektu programu i rzadko korzystają z funkcji językowych wymagających dynamicznego ładowania (takich jak moduły wtyczek). Biblioteki dynamiczne mają dodatkową trudność polegającą na tym, że są znacznie mniej przenośne w systemach operacyjnych niż biblioteki statyczne.

W wyniku tego większość systemów HPC korzysta z kompilacji statycznej, jeśli jest dostępna. Biblioteki statyczne są postrzegane jako szybsze, łatwiejsze w instalacji i utrzymaniu oraz ogólnie bardziej niezawodne. Kody HPC oparte na Pythonie są jednym z wyjątków od tego, ale nadal podlegają problemom z wydajnością związanym z dynamicznym ładowaniem (kilku użytkowników scicomp aktualnie pracuje nad tym problemem!).

Wybierając łączenie statyczne vs. dynamiczne, należy rozważyć sposób i miejsce wdrożenia kodu, możliwość zmiany lub przeniesienia bazowych bibliotek oraz charakterystyki wydajności sieciowego systemu plików. Powinieneś także ocenić, czy potrzebujesz dynamicznego linkowania, albo poprzez zależność od biblioteki, albo do współpracy z dynamicznym językiem skryptowym, takim jak Python.

Pojedyncza biblioteka dynamiczna jest terminem specyficznym dla Intela. Odnosi się do upakowania ich bibliotek dynamicznych w jednej meta-bibliotece, aby uprościć proces łączenia. Jeśli będziesz używać dynamicznego łączenia z bibliotekami Intel, ta forma jest prawdopodobnie preferowana, chyba że robisz coś skomplikowanego.

Aron Ahmadia
źródło
Doskonała odpowiedź! Jeszcze jedno: zdaję sobie sprawę, że dynamiczne łączenie byłoby niepotrzebne, a wybór będzie pomiędzy statycznym a pojedynczym dynamicznym. Mówisz, że powinienem wybrać to drugie, chyba że robię coś skomplikowanego (czego nie jestem). Czy powinienem łączyć za pomocą Single Dynamic? [FWiW, pracuję nad metodami podprzestrzeni Kryłowa]
Zapytanie
Przepraszam! Miałem na myśli, że powinieneś domyślnie używać static, ale wolisz pojedynczą dynamikę niż dynamikę.
Aron Ahmadia
Przeprowadziłem testy porównawcze i znalazłem: Dynamic : 0:42.92 Static : 0:42.93 Single Dynamic : 0:42.97uśredniono ponad 1000 wartości.
Inquest
1
Warto zauważyć, że w niektórych systemach HPC należy połączyć statycznie - w systemach BlueGene / L dzieje się tak na przykład, ponieważ zmniejszony system operacyjny w węzłach obliczeniowych nie obsługuje dynamicznego łączenia.
Aesin,
1
Jestem nieco zdezorientowany twoim stwierdzeniem: „W obecnej generacji superkomputerów zwykle działa tylko jedno zadanie na węzeł, co znacznie zmniejsza wszelkie korzyści wynikające ze zmniejszonego zużycia pamięci z powodu bibliotek współdzielonych”. Czy chciałeś powiedzieć, że istnieje tylko jeden proces na węzeł? Nie jestem pewien, jak jedno zadanie na węzeł wpływa na sytuację. Podczas statycznego łączenia każdy proces przechowuje pełną kopię pliku wykonywalnego, co może być znaczące wraz ze wzrostem liczby rdzeni na procesor. Łączenie dynamiczne będzie wymagało tylko jednej kopii biblioteki dynamicznej na przestrzeń pamięci współużytkowanej.
andybauer