350 likes | 530 Views
Профилирование как аспект контролируемого выполнения. Галатенко В.А., Костюхин К.А., Малиновский А.С. НИИСИ РАН Москва, 2007. План доклада. Определение контролируемого выполнения Аппаратные возможности современных процессоров по измерению производительности
E N D
Профилирование как аспект контролируемого выполнения Галатенко В.А., Костюхин К.А., Малиновский А.С. НИИСИ РАН Москва, 2007
План доклада • Определение контролируемого выполнения • Аппаратные возможности современных процессоров по измерению производительности • Проект PAPI (Perfomance Application Programming Interface) • Архитектура PAPI • Высокоуровневый интерфейс PAPI • Низкоуровневый интерфейс PAPI • Дополнительные возможности PAPI • Инструменты, использующие PAPI • Организация профилирования в рамках инструментального комплекса СОМ • Заключение
Оптимизация кода • Оптимизация ключей компилятора • Подключение библиотек • Профилирование • Оптимизация блоков кода и размещение данных для устранения эффекта «бутылочного горлышка»
Аппаратные счетчики • Набор регистров, хранящих число возникших событий определенного типа • Отслеживание этих событий облегчает оптимизацию выполнения программы на данном CPU
Примеры событий • Общее число тактов • Общее число команд • Число операций с плавающей точкой • Число тактов простоя функционального устройства • Число промахов при работе с кэш-памятью • Число промахов при работе с виртуальной памятью
Цель проекта PAPI • Цель проекта PAPI - разработка, стандартизация и реализация переносимого и эффективного API для доступа к аппаратным счетчикам • Parallel Tools Consortium project http://www.ptools.org/
Интерфейсы PAPI • PAPI предоставляет следующие интерфейсы для доступа к аппаратным счетчикам: • Низкоуровневый интерфейс обеспечивает гибкую работу с группами аппаратных событий (EventSets) • Высокоуровневый интерфейс предоставляет возможность запуска, останова и чтения счетчиков, привязанных к определенному списку событий
Архитектура PAPI GUI Низкий уровень PAPI Высокий уровень PAPI Платформо-зависимый уровень PAPI Расширения ядра Операционная система Аппаратные счетчики
Платформы Linux/x86, Windows 2000 Требуется заплата для ядра Linux, драйвер для Windows Linux/IA-64 Sun Solaris/Ultra 2.8 IBM AIX/Power Требуется pmtoolkit от IBM SGI IRIX/MIPS Compaq Tru64/Alpha Ev6 & Ev67 Требуется драйвер от Compaq Cray T3E/Unicos Реализация PAPI
Реализация PAPI • Поддержка языков Си и фортран • Обертки для использования в Matlab • Официальный сайт: http://icl.cs.utk.edu/projects/papi/
Высокоуровневый интерфейс • Простой интерфейс, предназначенный для измерения числа только предопределенных в PAPI событий • Использует вызовы низкоуровневого интерфейса • Требует меньшей настройки, чем низкоуровневый интерфейс
ФортранPAPIF_start_countersPAPIF_read_countersPAPIF_stop_countersPAPIF_accum_countersPAPIF_num_countersPAPIF_flopsФортранPAPIF_start_countersPAPIF_read_countersPAPIF_stop_countersPAPIF_accum_countersPAPIF_num_countersPAPIF_flops Список функций • СиPAPI_start_countersPAPI_read_countersPAPI_stop_countersPAPI_accum_countersPAPI_num_countersPAPI_flops
Использование высокоуровневого интерфейса • Int PAPI_num_counters(void) • Инициализирует PAPI (если требуется) • Возвращает число аппаратных счетчиков • int PAPI_start_counters(int *events, int len) • Инициализирует PAPI (если требуется) • Связывает множество событий с аппаратными счетчиками • Запускает счетчики • int PAPI_library_init(int version) • Функция низкого уровня, вызываемая автоматически
Управление счетчиками • PAPI_stop_counters(long_long *vals, int alen) • Останавливает счетчики и сохраняет их значения в массив • PAPI_accum_counters(long_long *vals, int alen) • Прибавляет значения счетчиков к значениям в массиве и обнуляет счетчики • PAPI_read_counters(long_long *vals, int alen) • Считывает значения счетчиков в массив и обнуляет счетчики
Пример long long values[NUM_EVENTS]; unsigned int Events[NUM_EVENTS]={PAPI_TOT_INS,PAPI_TOT_CYC}; /* Start the counters */ PAPI_start_counters((int*)Events,NUM_EVENTS); /* What we are monitoring? */ do_work(); /* Stop the counters and store the results in values */ retval = PAPI_stop_counters(values,NUM_EVENTS);
Использование низкоуровневого интерфейса • Расширенная функциональность и большая эффективность • Около 40 функций • Получение информации о выполняемом файле и аппаратуре • Поддержка мультиплексирования • Обработка переполнения счетчика
Функциональность • Инициализация библиотеки PAPI_library_init, PAPI_thread_init, PAPI_shutdown • Функции измерения времени PAPI_get_real_usec, PAPI_get_virt_usecPAPI_get_real_cyc, PAPI_get_virt_cyc • Функции получения информации • Служебные функции
Множества событий • Множество событий содержит следующую информацию: • Какие счетчики к каким событиям привязаны • Последние значения счетчиков • Статус множества (запущено/приостановлено) • Параметры множества (область действия, степень детализации и т.п.)
Операции над множествами событий • Создание/удаление множества событий PAPI_create_eventset, PAPI_add_event[s], PAPI_rem_event[s], PAPI_destroy_eventset • Управление профилированиемPAPI_start, PAPI_stop, PAPI_read, PAPI_accum • Управление состоянием множества событийPAPI_state, PAPI_list_events,...
Простой пример #include "papi.h“ #define NUM_EVENTS 2 int Events[NUM_EVENTS]={PAPI_FP_INS,PAPI_TOT_CYC}, EventSet;long_long values[NUM_EVENTS]; /* Initialize the Library */ retval = PAPI_library_init(PAPI_VER_CURRENT); /* Allocate space for the new eventset and do setup */ retval = PAPI_create_eventset(&EventSet); /* Add Flops and total cycles to the eventset */ retval = PAPI_add_events(&EventSet,Events,NUM_EVENTS); /* Start the counters */ retval = PAPI_start(EventSet); do_work(); /* What we want to monitor*/ /*Stop counters and store results in values */ retval = PAPI_stop(EventSet,values);
Области действия счетчиков • int PAPI_set_domain(int domain); • PAPI_DOM_USER режим пользователя • PAPI_DOM_KERNEL режим ядра • PAPI_DOM_OTHER обработка исключений • PAPI_DOM_ALL Все, выше перечисленное • Наличие конкретной области действия зависит от ОС
Степень детализации профилирования • int PAPI_set_granularity(int granul); • PAPI_GRN_THR поток управления • PAPI_GRN_PROC процесс • PAPI_GRN_PROCG группа процессов • PAPI_GRN_SYS текущий процессор • PAPI_GRN_SYS_CPU все процессоры • PAPI_GRN_MIN (=PAPI_GRN_THR) • PAPI_GRN_MAX (=PAPI_GRN_SYS_CPU) • Требует поддержки со стороны ОС
Использование PAPI с потоками управления • После вызова PAPI_library_init надо указать функцию, возвращающую идентификатор потока • Pthreads retval=PAPI_thread_init(pthread_self, 0); • OpenMP retval=PAPI_thread_init(omp_get_thread_num, 0); • Каждый поток создает собственные группы событий и их привязку к аппаратным счетчикам
Мультиплексирование • Мультиплексирование позволяет использовать один аппаратный счетчик для подсчета нескольких событий • PAPI_multiplex_init(); инициализирует мультиплексирование • PAPI_set_multiplex (int *EventSet); включает мультиплексирование для данного множества
Переполнение счетчиков • PAPI позволяет вызывать пользовательский обработчик в случае переполнения аппаратного счетчика • int PAPI_overflow (int EventSet, int EventCode, int threshold, int flags, PAPI_overflow_handler_t handler); задает пользовательский обработчик
Инструменты, использующие PAPI • DEEP/PAPI (Pacific Sierra) http://www.psrv.com/deep_papi_top.html • TAU (Allen Mallony, U of Oregon) http://www.cs.uoregon.edu/research/paracomp/tau/ • SvPablo (Dan Reed, U of Illinois) http://vibes.cs.uiuc.edu/Software/SvPablo/svPablo.htm • Cactus (Ed Seidel, Max Plank/U of Illinois) http://www.aei-potsdam.mpg.de • Vprof (Curtis Janssen, Sandia Livermore Lab) http://aros.ca.sandia.gov/~cljanss/perf/vprof/ • Cluster Tools (Al Geist, ORNL) • DynaProf (Phil Mucci, UTK) http://www.cs.utk.edu/~mucci/dynaprof/
Организация профилированияв рамках инструментальногокомплекса СОМ
Библиотека профилирования • Реализует дополненный вариант стандарта PAPI (добавлены функции настройки параметров профилирования и управления сбором событий в среде ППС) • Позволяет инструментованному приложению взаимодействовать с другими компонентами комплекса СОМ
Вызовы БП void PAPI_set_buffer_size (int size) Устанавливает размер кольцевого буфера в size слов int PAPI_get_buffer_size () Возвращает размер кольцевого буфера void PAPI_set_buffer_addr (int address) Устанавливает адрес кольцевого буфера равным address int PAPI_get_buffer_addr () Возвращает адрес кольцевого буфера int PAPI_event_create (int event_number, int event_data) Сохраняет номер события event_number, время его возникновения (значение счетчика) и ассоциированные с событием данные event_data в кольцевой буфер. Функция использует вызовы PAPI для получения значения счетчика. Возвращает PAPI_OK.
if (PAPI_library_init (PAPI_VER_CURRENT) != PAPI_VER_CURRENT) { exit (1); } /* ... */PAPI_event_create (1, 0); /* Событие с номером 1 соответствует времени ожидания данных с ПД */ ge_wait (EV_READY); PAPI_event_create (1, 0); PAPI_event_create (2, 0); /* Событие с номером 2 соответствует времени обработки данных */ do_calcs (); PAPI_event_create (2, 0); ge_set (EV_FINISHED); /* ... */
Дамп памяти процессора ППС с сохраненной информацией о событиях профилирования----- Area ----- 2-SP:A y:10070000..cy:10070000 1 2 0y:10070003 1 34698 0 y:10070006 2 34699 0 y:10070009 2 145045 0
Выводы • Стандартизованное, переносимое решение для кросс-платформенной оптимизации • Наличие библиотек для основных современных платформ • Хорошая документированность и простота использования