Skocz do: nawigacji, wyszukiwania

Amphsms2


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:
    Vtune5.png
  2. Z drzewa analiz Analysis Type wybieramy rodzaj analizy – Advanced 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:
Vtune6.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. CPU Time – czas CPU potrzebny na wykonanie aplikacji (suma czasu CPU wszystkich wątków aplikacji)
  3. Overhead Time – czas CPU spędzony na synchronizację
  4. Spin Time – czas oczekiwania, gdy procesor był zajęty
  5. Effective Time – przedstawia, czas CPU potrzebny na wykonanie kod użytkownika. Nie zawiera ona w sobie wartości dwóch powyższych metryk.
  6. Instruction Retired - szacowana liczba instrukcji wykonanych w trakcie działania programu
  7. CPI Rate - podstawowa metryka przedawiająca wydajność aplikacji. Jej wartość powinna być jak najniższa. W przeciwnym razie, kiedy oznaczona jest kolorem różowym mamy do czynienia niską wydajnością obliczeń
  8. CPU Frequency Ratio - określa jaka częstotliwość taktowania jednostki obliczeniowej wykorzystana została w trakcie wykonywania aplikacji. W przypadku kiedy jej wartość wynosi 1 oznacza to, że czętotliwość taktowania była równa nominalnej wartości. W przypadku, kiedy wartość metryki jest większa niż 1, oznacza to, że jednostka obliczeniowa pracowała w trybie Turbo
  9. Paused Time - czas na jaki wstrzymano analizę
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 42 sekund (42,731). 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 rdzeni. Po najechaniu na słupek, wyświetlana jest ilość czasu, jaką aplikacja spędza na obliczeniach wykorzystując daną liczbę logicznych rdzeni.
Vtune7.png

Widzimy, że mamy do czynienia z koprocesorem posiadającym 244. 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:
    Vtune8.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 rdzeń.

Na dole zakładki znajduje część przedstawiająca wydajność wątków (Timeline). Graf prezentuje wykorzystanie jednostki obliczeniowej 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 jednostki obliczeniowej 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 rdzeni w systemie. Intel VTune Amplifier oblicza poziom wykorzystania rdzeni na podstawie sumy czasu wykorzystywanego przez wszystkie wątki aplikacji. Maksymalną wartość na wykresie jest obliczana według wzoru: liczba logicznych rdzeni x 100%.


Analiza kodu

  1. Klikamy dwukrotnie na funkcję Multipication. Otwarta zostanie zakładka Source, która dla analizowanej aplikacji wygląda następująco:
Vtune9.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 89.

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 >