63
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction) Курносов Михаил Георгиевич к.т .н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net

Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Embed Size (px)

Citation preview

Page 1: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Лекция 1:

Архитектурно-ориентированная

оптимизация программного обеспечения

(Software optimization: Introduction)

Курносов Михаил Георгиевич

к.т.н. доцент Кафедры вычислительных систем

Сибирский государственный университет

телекоммуникаций и информатики

http://www.mkurnosov.net

Page 2: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Архитектура ЭВМ Дж. фон Неймана

22

Первые ЭВМ – проблемно-ориентированные

� Colossus Mark II: первая в мире программируемая ЭВМ,

2500 электронных ламп, расшифровки радиосообщений,

Великобритания, 1943-1944

� ABC (Atanasoff–Berry Computer): электронные лампы,

решение СЛАУ, США, 1937-1942

� ENIAC: электронные лампы, конструкторский набор

из 30 вычислительных устройств, Дж. Экерт, Дж. Мокли,

Дж. Фон Нейман, США, 1943-1945

Page 3: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Архитектура ЭВМ Дж. фон Неймана

33

Первые ЭВМ с хранимой в памяти программой

� EDVAC: Дж. Экерт, Дж. Мокли, Дж. Фон Нейман, Г. Голдсайн,

США, 1944-1951

Основные черты архитектуры ЭВМ Дж. Фон Неймана

� Принцип однородности памяти – команды и данные хранятся

в одной и той же памяти (внешне неразличимы)

� Принцип адресности – память состоит из пронумерованных

ячеек, процессору в произвольный момент доступна любая

ячейка

� Принцип программного управления – вычисления

представлены в виде программы, состоящей из

последовательности команд

� Принцип двоичного кодирования – вся информация, как

данные, так и команды, кодируются двоичными цифрами 0 и 1

Page 4: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Архитектура ЭВМ Дж. фон Неймана

44

Узкое место архитектуры Дж. фон Неймана –

совместное использование шины для памяти

программ и памяти данных (это ограничивает пропускную

способность между процессором и памятью)

Page 5: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Увеличение производительности ЭВМ

55

Совершенствование элементной базы

� электромеханические реле,

вакуумные лампы

� транзисторы

� микросхемы низкой

степени интеграции

� БИС, СБИС, микропроцессоры

� оптические, квантовые, молекулярные процессоры

?

Page 6: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Увеличение производительности ЭВМ

66

Совершенствование архитектуры ЭВМ

� Совершенствование процесса выполнения инструкций

o Совершенствование архитектуры набора команд:

RISC, CISC, MISC, VLIW

o Параллелизм уровня инструкций:

конвейерная архитектура, суперскалярная обработка

o Параллелизм уровня потоков:

многопроцессорные системы, одновременная

многопоточность, многоядерные процессоры

o Параллелизм данных: векторная обработка данных

(векторные процессоры/инструкции)

Page 7: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Увеличение производительности ЭВМ

77

Совершенствование архитектуры ЭВМ

� Смена парадигмы организации вычисления

� Архитектура с управлением потоком команд

(control flow, классическая архитектура фон Неймана) –

последовательность выполнения инструкций задана

программой

� Архитектура с управлением потоком данных (data flow) –

нет счетчика инструкций, команды выполняются

по готовности входных данных (операндов),

порядок выполнения операций заранее неизвестен

Бурцев В.С. Новые принципы организации вычислительных

процессов высокого параллелизма // МСО-2003, URL:

http://old.lvk.cs.msu.su/files/mco2003/burtsev.pdf

Page 8: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

88

Параллелизм уровня инструкций

(Instruction Level Parallelism – ILP)

Page 9: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Вычислительный конвейер (Instruction pipeline)

99

� Микроконтроллеры Atmel AVR, PIC – 2-этапный конвейер

� Intel 80486 – 5-stage (scalar, CISC)

� Intel Pentium – 5-stage (2 integer execution units)

� Intel Pentium Pro – 14-stage pipeline

� Intel Pentium 4 (Cedar Mill) – 31-stage pipeline

� Intel Core i7 4771 (Haswell) – 14-stage pipeline

� ARM Cortex-A15 – 15 stage integer/17–25 stage floating

point pipeline

Page 10: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Вычислительный конвейер (Instruction pipeline)

1010

Основные этапы обработки инструкций

(RISC pipeline)

1. IF (Instruction Fetch) – загрузка инструкции из памяти (кэша

инструкций, 1 такт)

2. ID (Instruction Decode) – декодирование инструкции

3. EX (Execution) – выполнение (Reg-Reg Op. – 1 такт,

Mem. ref. – 2 такта; Div, Mul, FP Ops. – требует > 1 такта)

4. MEM (Memory access) – доступ к памяти (чтение/запись)

5. WB (Register Write Back) – запись в регистры

Page 11: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Вычислительный конвейер (Instruction pipeline)

1111

Основные этапы обработки инструкций

(RISC pipeline)

1. IF (Instruction Fetch) – загрузка инструкции из памяти (кэша

инструкций, 1 такт)

2. ID (Instruction Decode) – декодирование инструкции

3. EX (Execution) – выполнение (Reg-Reg Op. – 1 такт,

Mem. ref. – 2 такта; Div, Mul, FP Ops. – требует > 1 такта)

4. MEM (Memory access) – доступ к памяти (чтение/запись)

5. WB (Register Write Back) – запись в регистры

Максимальное ускорение (Pipeline speedup)

равно числу этапов конвейера

Page 12: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Pentium II Pipeline (11 stages)

1212

IFU Instruction Fetch Unit

ID Instruction Decode

RAT Register Allocation Table (or Allocator)

ROB Reorder Buffer

DIS Dispatcher

EX Execute Stage

RET Retire Unit

1. Processor fetches instructions from memory in (static) program sequence

2. Each instruction is translated into one or more fixed-length RISC instructions

(micro-ops)

3. Processor executes the micro-ops in superscalar pipeline fashion; micro-ops may

execute out-of-order

4. Processor commits results of each micro-op to the register set in (dynamic)

program sequence

Page 13: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Конфликты данных (Data hazards)

1313

� Текущий шаг конвейера не может быть выполнен, так как

зависит от результатов выполнения предыдущего шага

� Возможные причины:

o Read after write (RAW) – true dependencyi1: R2 = R1 + R3

i2: R4 = R2 + R3

o Write after read (WAR) – anti-dependencyR4 = R1 + R3

R3 = R1 + R2

o Write after write (WAW) – output dependencyR2 = R4 + R7

R2 = R1 + R3 Для разрешения проблемы конвейер

приостанавливается (pipeline stall, bubble)

Page 14: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Конфликты данных (Data hazards)

1414

� Текущий шаг конвейера не может быть выполнен, так как

зависит от результатов выполнения предыдущего шага

� Возможные причины:

o Read after write (RAW) – true dependencyi1: R2 = R1 + R3

i2: R4 = R2 + R3

o Write after read (WAR) – anti-dependencyR4 = R1 + R3

R3 = R1 + R2

o Write after write (WAW) – output dependencyR2 = R4 + R7

R2 = R1 + R3

Step IF ID EX ST

1 i1

2 i2 i1

3 i2 i1

4 i2 i1

5

Data Hazard – Read After Write (RAW)

Для разрешения проблемы конвейер

приостанавливается (pipeline stall, bubble)

Page 15: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Конфликты управления (Control hazards)

1515

.text

movl %ebx, %eax

cmpl $0x10, %eax

jne not_equal

mov %eax, %ecx

jmp end

not_equal:

mov $-0x1, %ecx

end:

Step IF ID EX ST

1 movl

2 cmpl movl

3 jne cmpl movl

4 ??? jne cmpl movl

5

6

7

� В процессоре присутствует модуль предсказания переходов

(Branch Prediction Unit), который управляет счетчиком команд

Page 16: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Суперскалярные процессоры (Superscalar)

1616

� Некоторые блоки конвейера (АЛУ, сдвиговое устройство,

умножитель, …) присутствуют в нескольких экземплярах

� За один такт процессор выполняет несколько инструкций

� Процессор динамически проверяет входные инструкции

на зависимость по данным – динамический планировщик

(dispatcher, динамическое распараллеливание)

a = b + c

b = e + f

a = b + c

d = e + f

Page 17: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Суперскалярные процессоры (Superscalar)

1717

� CDC 6600 (1965)

� Intel i960CA (1988)

� AMD 29000-series 29050 (1990)

� Intel Pentium – первый суперскалярный x86 процессор,

2 datapaths (pipelines)

Page 18: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Intel Core Microarchitecture

1818

Page 19: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Процессоры с широким командным словом (VLIW)

1919

� В архитектуре VLIW (Very Long Instruction Word) каждая

инструкция содержит несколько независимых команд для

выполнения на разных устройствах (ALU, FPU, etc).

� Формирование широких команд полностью возложено

на компилятор!

� Примеры

o Эльбрус 2000 – (6 ALU, до 23 операций за такт)

o Intel Itanium – 3 команды в 128-битной инструкции,

на стадии IF загружается 2 инстр. => 6 команд за такт

o Transmeta Efficeon – 2 ALU, 2 LD/ST, 2 FPU; 8 команд

в 256-битной инструкции

o Texas Instruments TMS320C6x –

8 команд в 256-битной инструкции

Page 20: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Одновременная многопоточность (SMT)

2020

� Одновременная многопоточность (Simultaneous

Multithreading – SMT, Hardware multithreading) —

технология, позволяющая выполнять инструкций

из нескольких независимых потоков выполнения на

множестве функциональных модулей суперскалярного

процессора в одном цикле

� Позволяет повысить эффективность использования

модулей суперскалярного процессора (ALU, FPU,

Load/Store) за счет большего разнообразия инструкций

(потоки могут принадлежать разного рода программам)

Page 21: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Одновременная многопоточность (SMT)

2121

Требования к реализации

� Модуль IF загружает инструкции из разных потоков

� Необходимо большое количество регистров для хранения

данных всех потоков

Пример реализации

� IBM ACS-360 – 1968

� DEC Alpha 21464 – 1999, 4-way SMT, 4 счетчика инструкций

� Intel Hyper-threading – Pentium 4 (2-way SMT, 2002),

� Intel Xeon Phi – 4-way SMT

� Fujitsu Sparc64 VI – 2-way SMT

� IBM POWER8 – 8-way SMT, 2013

� IBM Cell – 2-way SMT

Page 22: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Intel HyperThreading Technology (SMT)

2222

Page 23: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Intel HyperThreading Technology (SMT)

2323

Architectural State – AS

Control registers

o Instruction Flag Registers

(EFLAGS in x86)

o Interrupt Mask Registers

o Memory management unit Regs

o Status registers

General purpose registers

(x86 EAX, EBX, ECX, …)

o Adder Registers

o Address Registers

o Counter Registers

o Index Registers

o Stack Registers

o String RegistersSpeedup

≈ 30%

Page 24: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

2424

Параллелизм уровня данных

(Data Parallelism – DP)

Page 25: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Векторные процессоры

2525

� Векторный процессор (Vector processor) – процессор

поддерживающий на уровне системы команд операции

для работы с одномерными массивами – векторами.

� Векторные вычислительные системы

o CDC STAR-100 (1972 г., векторы до 65535 элементов)

o Cray Research Inc.: Cray-1 (векторные регистры),

Cray-2, Cray X-MP, Cray Y-MP

Page 26: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Векторные инструкции

2626

X1 X2 … XNSource 1

Y1 Y2 … YNSource 2

X1 + Y1 X2 + Y2 … XN + YNDestination

+ + +

SIMD – Single Instruction Stream,

Multiple Data Stream

Page 27: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Векторные инструкции

2727

X1 X2 … XNSource 1

Y1 Y2 … YNSource 2

X1 + Y1 X2 + Y2 … XN + YNDestination

+ + +

SIMD – Single Instruction Stream,

Multiple Data Stream

Максимальное ускорение (Speedup)

равно количеству элементов

в векторном регистре

(использование векторных инструкций может привести к сокращению

количества команд в программе, а это может обеспечить более

эффективное использование кеш-памяти)

Page 28: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Современные процессоры

2828

SIMD-инструкции в составе наборов команд

� Intel MMX (1996)

� Motorola PowerPC, IBM POWER AltiVec (1999)

� AMD 3DNow! (1998)

� Intel SSE (Intel Pentium III, 1999)

� Intel SSE2, SSE3, SSE4

� AVX (Advanced Vector Extension, Intel & AMD, 2008)

� AVX2 (Haswell, 2013)

� AVX-512 (2015)

� ARM Advanced SIMD (NEON) – Cortex-A8, 2011

Page 29: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Пример использования SSE-инструкций

2929

void add_sse_asm(float *a, float *b, float *c)

{

__asm__ __volatile__

(

"movaps (%[a]), %%xmm0 \n\t"

"movaps (%[b]), %%xmm1 \n\t"

"addps %%xmm1, %%xmm0 \n\t"

"movaps %%xmm0, %[c] \n\t"

: [c] "=m" (*c)

: [a] "r" (a), [b] "r" (b)

: "%xmm0", "%xmm1"

);

}

Page 30: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

3030

Параллелизм уровня потоков

(Thread Level Parallelism – TLP)

Page 31: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Symmetric multiprocessing (SMP)

3131

CPU 1

Cache

CPU 2

Cache

CPU n

Cache

I/O

Bus

Arbiter

System Bus

Shared Memory

� Системная шина (System Bus) – узкое место,

ограничивающая масштабируемость вычислительного узла

Page 32: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Symmetric multiprocessing (SMP)

3232

Page 33: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

NUMA - Non-Uniform Memory Architectutre

3333

� У каждого процессора имеется локальная память

� Доступ к удаленной памяти занимает больше времени

(примерно на 30%, HyperTransport, 2006)

AMD Hyper-Transport

Page 34: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

NUMA - Non-Uniform Memory Architectutre

3434

Intel Quick Path Interconnect (QPI)

Page 35: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

NUMA - Non-Uniform Memory Architectutre

3535

Intel Nehalem based systems with QPI

2-way Xeon 5600 (Westmere) 6-core, 2 IOH

Page 36: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Multicore processor

3636

Page 37: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

3737

Специализированные

сопроцессоры и ускорители

(Coprocessors & Accelerators)

Page 38: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

GPU – Graphics Processing Unit

3838

� NVidia Kepler

� AMD FirePro

� Специализированные

мультипроцессоры (SMP)

� Каждый процессор

многоядерный

Page 39: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

IBM Cell (Cell BE)

3939

� Sony PlayStation 3

� IBM Roadrunner

Page 40: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Intel Xeon Phi (Intel MIC)

4040

� Более 50 ядер x86 (in-order, short pipeline, 4-way SMT,

512-bit SIMD)

� Кольцевая шина (1024 бит) для связи ядер

и контроллера памяти

� Память GDDR5 (поддержка виртуальной памяти)

Page 41: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Intel Xeon Phi (Intel MIC): KNF Core

4141

Page 42: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

4242

Распределенные

вычислительные системы

(Distributed Computer Systems)

Page 43: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Вычислительные кластеры

4343

Page 44: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Гибридные вычислительные узлы

4444

CPU1

Core1 Core2 Core3 Core4

GPU1

Cores

GPU Memory

Memory (DDR3)

CPU2

Core1 Core2 Core3 Core4

Memory (DDR3)

QPI

I/O Hub

QPI QPI

PCI Express Gen. 2

GPU2

Cores

GPU Memory

Page 45: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Цели оптимизации программного обеспечения

45

� Минимизация времени выполнения

� Минимизация объема потребляемой памяти

� Минимизация энергопотребления

процессором/вычислительным узлом

45

Page 46: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Подходы к оптимизации кода

46

1. Алгоритмическая оптимизация кода

2. Распараллеливание – Thread Level Parallelism

(OpenMP/Pthreads, CUDA/OpenCL/OpenACC, MPI)

3. Оптимизация доступа к памяти

(кеш-памяти, ОЗУ, дисковой, сетевым хранилищам)

4. Векторизация кода – Data Parallelism

(SSE, AVX, AltiVec, ARM SIMD)

5. Оптимизация ветвлений, оптимизация

загрузки конвейеров – Instruction Level Parallelism

46

Page 47: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Подходы к оптимизации кода

47

1. Осуществляется профилирование кода (проблемных

участков) и выявляются “горячие точки” (hot spots)

– участки программы выполняющиеся дольше всего

2. Горячие точки сортируются в порядке не убывания

времени выполнения – формируется приоритетный

список участков программы для последующей

оптимизации

3. Каждая горячая точка оптимизируется

4. После оптимизации каждого “хот спота”

проводится тестирование программы – проверяется

совпадение результатов её работы до модификации и

после внесения изменений 47

Page 48: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Оптимизирующие компиляторы

48

� GNU GCC

gcc -march=core2 -O2

� Intel ICC

icc –xT -O2

� PathScale Compiler

pathcc -march=core -O2

� Oracle Solaris Studio

cc –xchip=core2 -O248

Page 49: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Profile-Guided Optimization (PGO)

49

1. Generate profile

� icc –prof-gen –o myprog ./myprog.c

� ./myprog

2. Use profile

� icc –prof-use –o myprogopt ./myprog.c

� ./myprogopt

49

Page 50: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Профилировщики

50

� Intel VTune Amplifier XE

� AMD CodeAnalyst

� Visual Studio Team System Profiler

� Linux perf

� Oprofile

� GNU gprof

� Valgrind – выполняет программу на виртуальной

машине

50

Page 51: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Режимы работы профилировщиков

51

� Семплирование (Sampling) – профилировщик

периодически снимает информацию о состоянии

программы (значения счетчиков производительности

процессора, значение счетчика команд, …) – формирует

статистику.

� На результаты семплирования значительно влияют другие

программы запущенные в системе

� При семплировании желательно, что бы исследуемая

программа работала относительно длительный

промежуток времени (профилировщик должен успеть

набрать статистику) и в системе было минимум

запущенных программ

Linux perf, Oprofile, Intel Vtune, AMD CodeAnalyst, …51

Page 52: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Режимы работы профилировщиков

52

� Инструментация (Instrumentation) – внедрение в

программу кода для перехвата интересующих пользователя

событий (например, вызова функций)

� Инструментация позволяет формировать граф вызово

программы, подробную информацию о времени

выполнения функций и др.

GNU gprof, Intel Vtune, Valgrind, AMD CodeAnalyst, …

52

Page 53: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Intel Vtune

5353

Page 54: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

CPU Dispatching

54

#include <mmintrin.h>

__declspec(cpu_specific(pentium))

void array_sum(int *r, int *a, int *b,size_t l)

{

for (; length > 0; l--) *result++ = *a++ + *b++;

}

__declspec(cpu_specific(pentium_MMX))

void array_sum(int *r,int const *a, int *b, size_t l)

{

/* Code for MMX */

}

__declspec(cpu_dispatch(pentium, pentium_MMX))

void array_sum (int *r,int const *a, int *b, size_t l))

{

} 54

Page 55: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Требования к тестам производительности

5555

� Воспроизводимость результатов измерений –

от запуска к запуску результаты должны совпадать

(с заданным допустимым отклонением)

� Репрезентативность – тест должен измерять именно

проблемный участок (с точки зрения производительности)

Page 56: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Тестирование производительности

5656

� Следует выбирать самый точный таймер имеющийся в

системе: gettimeofday, HPET, RDTSC, …

� Необходимо учитывать эффекты кеш-памяти и возможно

игнорировать первый запуск теста (прогревочный) – не

включать его в итоговый результат

� Измерения желательно проводить несколько раз и

вычислять оценку мат. ожидания (среднее значение)

измеряемой величины (например, времени выполнения) и

дисперсию

� Запуск тестов желательно осуществлять всегда в одних и

тех же условиях – набор запущенных программ,

аппаратурная конфигурация, …

Page 57: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Измерение времени выполнения кода (Timing)

5757

� int gettimeofday(struct timeval *tv, struct timezone *tz)

� int clock_gettime(clockid_t clk_id, struct timespec *tp)

� clock_t clock(void)

� Time Stamp Counter (TSC, 64-bit CPU register)

Page 58: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

#include <sys/time.h>

int main()

{

struct timeval t1, t2;

double t;

gettimeofday(&t1, NULL);

/* Measured code */

gettimeofday(&t2, NULL);

t = (t2.tv_sec * 1E6 + t2.tv_usec –

t1.tv_sec * 1E6 - t1.tv_usec) * 1E-6;

printf("Elapsed time: %.6f sec.\n", t);

return 0;

}

Функция gettimeofday

5858

Page 59: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Time Stamp Counter

5959

#include <stdio.h>

#include "hrtimer.h"

int main()

{

double t;

t = hrtimer_wtime();

/* Measured code */

t = hrtimer_wtime() - t;

printf("Elapsed time: %.6f sec.\n", t);

return 0;

}

Page 60: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

static __inline__ uint64_t hrtimer_gettsc()

{

#if defined(__x86_64__)

uint32_t low, high;

__asm__ __volatile__(

"xorl %%eax, %%eax\n"

"cpuid\n"

::: "%rax", "%rbx", "%rcx", "%rdx"

);

__asm__ __volatile__(

"rdtsc\n"

: "=a" (low), "=d" (high)

);

return ((uint64_t)high << 32) | low;

#else

# error "Unsupported platform"

#endif

}

Time Stamp Counter

6060

Page 61: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

void hrtimer_initialize()

{

hrtimer_overhead =

hrtimer_measure_overhead();

hrtimer_freq =

hrtimer_calibrate_sleep(hrtimer_overhead);

is_hrtimer_initialized = 1;

}

Time Stamp Counter

6161

double hrtimer_wtime()

{

if (!is_hrtimer_initialized)

hrtimer_initialize();

return (double)(hrtimer_gettsc() -

hrtimer_overhead) /

(double)hrtimer_freq;

}

Page 62: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

static uint64_t hrtimer_measure_overhead()

{

enum {

TSC_OVERHEAD_NTESTS = 10

};

int i;

uint64_t count, overhead = (uint64_t)~0x01;

/* Warm-up passes, determine timer overhead */

for (i = 0; i < TSC_OVERHEAD_NTESTS; i++) {

count = hrtimer_gettsc();

count = hrtimer_gettsc() - count;

if (count < overhead) {

overhead = count;

}

}

return overhead;

}

Time Stamp Counter

6262

Page 63: Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (Software optimization: Introduction)

Time Stamp Counter

6363

static uint64_t hrtimer_calibrate_sleep(

uint64_t overhead)

{

uint64_t count;

int delay = 3;

count = hrtimer_gettsc();

sleep(delay);

count = hrtimer_gettsc() - count –

overhead;

return count / delay;

}