Архитектура микропроцессоров
Задание 0
Научиться измерять время выполнения участка кода, запускать приложение с приоритетом реального времени. Например.
Задание 1
Написать программу, копирующую 1 гигабайт памяти следующими способами:
- цикл
- memcpy
- movs
- самый быстрый способ, который сможете найти на своём процессоре (SSE, стек, movnt...)
Вывести и сравнить результаты в зависимости от объёма блока памяти. Примеры быстрых реализаций memcpy.
Задание 2.1
Вывести информацию о кешах процессора, которая доступна с помощью команды CPUID.
Задание 2.2
Вывести графики изменения производительности операций с памятью в зависимости от шага (stride) и размера блоков (block size). Интерпретировать графики для обнаружения влияния кешей.
for (times = 0; times < many_times; times++) for (i = 0; i < block_size; i = i + stride) dummy = A[i];
Задание 3.1
Сравнить производительность кода в зависимости от эффективности предсказания ветвлений.
- условие на чётные/нечётные итерации
- условие на случайный выбор
- условие, минимизирующее успешные предсказания для каждого паттерна из N переходов.
Задание 3.2
Вывести графики зависимости времени исполнения перехода от количества вариантов целевого адреса.
Рассмотреть способы ветвления:
- последовательные условные переходы
- косвенный переход
- самомодифицирующийся код (без барьера памяти и с барьером)
Задание 4
Воспроизвести на своём компьютере
T. Downs Where do interrupts happen?
Сравнить результаты.