Использование SIMD-расширений

  1. Распакуйте в каталог архив.
  2. Получите объектный и исполняемый файлы, выполнив команду make.
  3. Исполните программу bmp из командной строки, используя собственное bmp-изображение.
  4. Заменив вызов bmpCopy на bmpGrayscale, исполните программу bmp, замерив время выполнения 1000 экземпляров программы, например, с помощью shell-команд: time for((i = 0; i < 1000; i++)) ; do ./bmp test.bmp testout.bmp ; done.
  5. Разберите формат представления в памяти цветовых карт bmp-изображения.
  6. В дополнение к фильтру 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).
  7. Разберите реализацию функций bmpGrayscale, bmpGrayscale2 (функция bmpGrayscale2 использует объединение обрабатываемых данных в четырехэлементные векторы и, несмотря на кажущееся излишество в коде, является ключом к пониманию дальнейшего ассемблерного кода).
  8. Заменив вызов bmpGrayscale на bmpGrayscale2, исполните программу bmp, используя bmp-изображение с кратными четырем и произвольными линейными размерами.
  9. Модифицируйте bmpGrayscale2 на случай корректной работы для любых линейных размеров изображения.
  10. Разберите функцию bmpGrayscaleSSE, скорректируйте для любых линейных размеров аналогично bmpGrayscale2.
  11. Исполните программу с функцией bmpGrayscaleSSE, замерив время выполнения 1000 экземпляров программы, сделайте выводы.