Skocz do: nawigacji, wyszukiwania

Amphscs2


Uruchomienie analizy


  1. Otwieramy zakładkę wyboru analizy, klikamy prawym przyciskiem na projekt w Project Navigator następnie wybieramy New Analisys… lub klikamy przycisk Button 12.png w pasku narzędzi. Zakładka z wyborem analizy wygląda następująco:
    Amp hs 1.png
  2. Z drzewa analiz Analysis Type wybieramy rodzaj analizy – Hotspots
  3. Uruchamiamy analizę klikając przycisk Start


W trakcie wykonywania analizy wyświetlona zostanie zakładka Collection Log, która przedstawia informacja o postępach analizy oraz czasie jaki upłynął od jej rozpoczęcia. Po zakończeniu analizy zebrane informacje wyświetlone zostaną w zakładce Summary



Interpretacja rezultatów


Po zakończeniu analizy automatycznie otwierana jest zakładka Summary, która w przypadku analizowanej przez nas aplikacji wygląda następująco:
Amp hs 2.png

W górnej części zakładki znajduje się sekcja Eplased Time, która przedstawia następujące dane na temat analizowanej aplikacji:

  1. Eplased Time – całkowity czas jaki minął od początku do końca zbierania informacji
  2. Total Thread Count – liczba wątków wykorzystanych w programie
  3. CPU Time – czas CPU potrzebny na wykonanie aplikacji (suma czasu CPU wszystkich wątków aplikacji)
  4. Overhead Time – czas CPU spędzony na synchronizację
  5. Spin Time – czas oczekiwania, gdy procesor był zajęty
  6. Effective Time – przedstawia, czas CPU potrzebny na wykonanie kod użytkownika. Nie zawiera ona w sobie wartości dwóch powyższych metryk.
Obok każdej z metryk znajduje się ikona pomocy . Po najechaniu na nią wskaźnikiem myszy wyświetlany jest szczegółowy opis każdej z nich. Jak widać na podstawie danych znajdujących się w sekcji Eplased Time, mamy do czynienia z jednowątkową aplikacją, która wykonuje obliczenia w czasie nieco ponad 30 sekund (30,775). Poniżej znajduje się sekcja Top Hotspots, która zawiera listę najbardziej czasochłonnych funkcji w analizowanej aplikacji, która posortowana jest malejąco według czasu CPU. Widzimy, że w przypadku analizowanej przez nas aplikacji jest nią funkcja, która oblicza iloczyn dwóch macierzy. Sekcja CPU Usage Histogram przedstawia wykres słupkowy ilustrujący jak analizowana aplikacja wykorzystuje system, w którym została uruchomiona. Oś X przestawia ilość logicznych CPU. Po najechaniu na słupek, wyświetlana jest ilość czasu, jaką aplikacja spędza na obliczeniach wykorzystując daną liczbę logicznych CPU.
Amp hs 3.png

Widzimy, że mamy do czynienia z systemem posiadającym 48 logicznych procesorów. W przypadku analizowanej aplikacji wszystkie obliczenia wykonane są przez jeden rdzeń. Average oznacza średnią liczbę CPU wykorzystaną w trakcie działania aplikacji, natomiast Taget Concurrency oznacza liczbę CPU jaka powinna zostać docelowo wykorzystana w aplikacji


Analiza najbardziej czasochłonnych funkcji

  1. Przechodzimy do zakładki Bottom-up, która w przypadku analizowanej aplikacji wygląda następująco:
    Amp hs 4.png

W zakładce Bottom-up przedstawione są bardziej szczegółowe dane na temat aplikacji. Dane przedstawione w zakładce posortowane są według kategorii wybranej z listy Grouping, domyślne dane sortowane są według funkcji. Wszystkie funkcje zaimplementowane w aplikacji wyświetlone są na liście w kolejności od najbardziej do najmniej czasochłonnej. Funkcja Multipication potrzebuje najwięcej czasu do wykonania obliczeń i jednocześnie w niskim stopniu wykorzystuje możliwości oferowane przez system (czerwony pasek ), co oznacza, że przez cały czas obliczeń wykorzystywany jest jedynie jeden logiczny procesor.


Obok listy znajduje się Call Stack, który prezentuje stos wywołań funkcji dla wybranej z listy pozycji. Stos funkcji przedstawiony jest w następującym formacie: <moduł>!<funkcja>-<plik źródłowy>:<numer lini>, gdzie numer linii odnosi się do następnej funkcji na stosie. W naszym przypadku widzimy, że funkcja Multipication wywoływana jest w funkcji main, w linii o numerze 111 znajdującej się w pliku matrix.cpp.


Na dole zakładki znajduje część przedstawiająca wydajność wątków (Timeline). Graf prezentuje wykorzystanie CPU przez poszczególne wątki aplikacji. Po najechaniu na dowolne miejsce na grafie, wyświetlony zostaje czas jaki upłynął od rozpoczęcia aplikacji oraz wykorzystanie CPU w tym momencie wykonywania aplikacji. Zaznaczenie wątku na liście umożliwia podgląd funkcji, w których wybrany wątek wykonuje obliczenia (funkcje zaznaczone zostają na liście). Poniżej znajduje się wykres CPU Usage, który przedstawia poziom wykorzystania wszystkich logicznych CPU w systemie. Intel VTune Amplifier oblicza poziom wykorzystania CPU na podstawie sumy czasu CPU wykorzystywanego przez wszystkie wątki aplikacji. Maksymalną wartość na wykresie jest obliczana według wzoru: liczba logicznych procesorów x 100%, czyli w systemie mającym 48 logicznych procesorów maksymalna wartość to 4800%. Na podstawie wykresu widzimy, że główny wątek programu wykorzystuje CPU w 100%.


Analiza kodu

  1. Klikamy dwukrotnie na funkcję Multipication. Otwarta zostanie zakładka Source, która dla analizowanej aplikacji wygląda następująco:
Amp hs 5.png

Zakładka Source przedstawia kod źródłowy aplikacji. Po otwarciu zakładki najbardziej czasochłonna linia kodu jest zaznaczona. Edycja kodu z poziomu zakładki jest niemożliwa. Zakładka Source umożliwia również podgląd kodu asemblerowego programu, poprzez kliknięcie przycisku Assembly. Dla wybranej linii z kodu źródłowego, zaznaczona/zaznaczone zostają instrukcj/instrukcje, które odpowiedzialne są za jej wykonanie. Zakładka przedstawia również czas potrzebny na wykonanie poszczególnych instrukcji. W przypadku analizowanej przez nas aplikacji 85% czasu potrzebnego do wykonania obliczeń w funkcji zajmuje linia o numerze 88.

Po zidentyfikowaniu problemu można przystąpić do jego rozwiązania. W przypadku aplikacji sekwencyjnych rozwiązaniem najczęściej okazuje się wprowadzenie zrównoleglenia (w przypadku systemów wielordzeniowych).



Rozwiązanie problemu


  1. Otwieramy plik matrix.cpp przy pomocy dowolnego edytora tekstowego
  2. Na początku pliku dodajemy plik nagłówkowy #include <omp.h>
  3. W funkcji Multipication zrównoleglimy zewnętrzną pętle umieszczając przed nią dyrektywę OpenMP - #pragma omp parallel for
  4. Otwieramy plik Makefile dowolnym edytorem tekstowym
  5. Do flag kompilacji dodajemy flagę -openmp
  6. Zapisujemy zmiany
  7. Uruchamiamy terminal
  8. Używając polecenia cd przechodzimy do katalogu, w którym znajduje się analizowana aplikacja
  9. Budujemy aplikację wpisując polecenie make



< Wstecz

Dalej >