Использование SIMD-расширений
- Распакуйте в каталог архив.
- Получите объектный и исполняемый файлы, выполнив команду make.
- Исполните программу bmp из командной строки, используя собственное bmp-изображение.
- Заменив вызов bmpCopy на bmpGrayscale, исполните программу bmp, замерив время выполнения 1000 экземпляров программы, например, с помощью shell-команд: time for((i = 0; i < 1000; i++)) ; do ./bmp test.bmp testout.bmp ; done.
- Разберите формат представления в памяти цветовых карт bmp-изображения.
- В дополнение к фильтру Grayscale, реализуйте фильтр (в виде функции) Sepia, используя следующие формулы преобразований: R' = (R * 0.393 + G * 0.769 + B * 0.189); G' = (R * 0.349 + G * 0.686 + B * 0.168); B' = (R * 0.272 + G * 0.534 + B * 0.131).
- Разберите реализацию функций bmpGrayscale, bmpGrayscale2 (функция bmpGrayscale2 использует объединение обрабатываемых данных в четырехэлементные векторы и, несмотря на кажущееся излишество в коде, является ключом к пониманию дальнейшего ассемблерного кода).
- Заменив вызов bmpGrayscale на bmpGrayscale2, исполните программу bmp, используя bmp-изображение с кратными четырем и произвольными линейными размерами.
- Модифицируйте bmpGrayscale2 на случай корректной работы для любых линейных размеров изображения.
- Разберите функцию bmpGrayscaleSSE, скорректируйте для любых линейных размеров аналогично bmpGrayscale2.
- Исполните программу с функцией bmpGrayscaleSSE, замерив время выполнения 1000 экземпляров программы, сделайте выводы.