Optymalizacja przez TMP |
Wpisany przez Patryk yarpo Jar | |
czwartek, 31 grudnia 2009 10:25 | |
TMP (template metaprogramming – metaprogramowanie szablonowe) nie jest już nowinką techniczną w świecie C++ (lepsze języki znały to od dawna). Nie jest także nowością, że można to użyć jako podpowiedź dla kompilatora “jak optymalizować operacje matematyczne”. Książka “Perełki Programowania Gier: Tom 1″ zawierająca opis m.in. tej techniki została wydana w 2002-gim roku. 3 lata później wydana została książka poświęcona w całości TMP, “Język C++. Metaprogramowanie za pomocą szablonów”. Powiedziano więc już na ten temat prawie wszystko, co można powiedzieć. Stąd moja wiadomość nie powinna uchodzić za odkrywczą.
Przeprowadzony test polegał na wielokrotnym mnożeniu macierzy N*N (naiwnym algorytmem o złożoności czasowen O(n^3) – są lepsze). Test był powtarzany dla różnych opcji kompilacji i dla różnych kompilatorów (konkretniej: tych trzech, które sprawdzałem również w poprzedniej wiadomości). Można powiedzieć: sprawdzam znów kompilatory, tylko pod innym kątem. Program testowy mnożył używając operatora * (a nie *=), co teoretycznie nie jest optymalne(wymaga dodatkowego kopiowania – kompilator powinien to zainlineować i zoptymalizować) ;-) Wykres przedstawia czas wykonania testu w sekundach w zależności od wielkości macierzy (2 oznacza macierz 2×2, 13 oznacza macierz 13×13). Wnioski? Szablonowe metaprogramowanie funduje dobre podpowiedzi kompilatorowi GCC dla macierzy 2×2, 3×3 oraz 4×4. Dla większych tylko wprowadza zamęt: z opcją -funroll-loops powstaje szybszy program mniejszym nakładem pracy (człowieka i komputera: skomplikowane programy TMP długo się kompilują) ;-) Dodatkowo nabroił tu kompilator Sun Studio: pomijając kwestię taką, że nie za bardzo wychodzi mu robienie programów z TMP, dla macierzy 4×4-elementowych i większych… miażdży on GCC ;-) Doskonale widać to na wykresie poniżej (prezentującym dla każdego z kompilatorów najlepszy wynik za jego pomocą uzyskany): Autorem artykułu jest Maciej Kamiński.
|