Методы ускорения
программ и алгоритмов

         Илья Цветков
           Video Group
    CS MSU Graphics & Media Lab
Only for
 Maxus 



                Содержание
           Введение
               Тестирование производительности
           Архитектура современных процессоров
               Особенности
               Типичное устройство
               Кэш
           Оптимизация
               Выбор алгоритмов
               Ветвления
               Память
               Циклы
               Медленные операции
               Вещественные вычисления
           SIMD
           Многопоточность


                                                  2
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



              Тезисы оптимизации
           Нельзя оптимизировать программу/функцию не
            запуская ее
           Необходимо тестирование на различных машинах
           Один из возможных путей оптимизации 
            удаление дополнительных возможностей
           Отладочные сборки программы не пригодны для
            тестирования производительности
           Оптимизация далеко не всегда требует написание
            ассемблерного кода
           Тестирование должно быть частью процесса
            разработки

                                                             3
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Методы ускорения
           Оптимизация с учетом особенной
            конкретной архитектуры
               Векторные инструкции
           Распараллеливание задачи
               Hyper-Threading
               Многоядерные процессоры
           Применение специализированных
            процессоров
               GPU
               nVidia CUDA, Intel Larabbee


                                              4
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Процесс оптимизации

            Создание            Отыскание          Определение         Модификация
              теста          «горячих» точек         причины            программы



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



      «Горячие» точки (hotspots):
        места наибольшей активности программы или функции;
        под активностью может пониматься:
               время, затрачиваемое на исполнение некоторого участка кода,
               количество неверно предсказанных ветвлений,
               количество промахов кэша;
           показывают области требующие оптимизации.


                                                                                     5
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Процесс оптимизации

            Создание                Отыскание         Определение       Модификация
              теста              «горячих» точек        причины          программы



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



      Инструментарий:
        средства измерения времени исполнения программы/функции;
        программный профайлер:
               sampling,
               instrumenting;
           оптимизирующий компилятор.



                                                                                      6
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Тестирование
             производительности

      Свойства теста производительности:
       Повторяемость результатов

       Отражение характерного поведения программы

       Простота использования

       Адекватность результатов

       Совмещение с тестирование функциональности

       Измерение времени исполнения

       Полное покрытие программы

       Точность измерений




                                                     7
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Измерение времени
             исполнения
      Таймер       Точность Максимум        Пример использования
      Функции      ±1 c        73 года      time_t start, elapsed;
      библиотеки                            Start = time(NULL);
      языка С                               // некоторый код
                                            elapsed = time(NULL) – start;

      Windows      ±10 мc      49 дней      DWORD start, elapsed;
      multimedia                            Start = timeGetTime();
      timer                                 // некоторый код
                                            elapsed = timeGetTime() – start;




                                                                               8
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Измерение времени
             исполнения
      Таймер       Точность Максимум        Пример использования
      Такты CPU    ±1 нc       4,29 с       DWORD start, elapsed;
      (32 бита)    (1 ГГц)                  _asm { RDTSC
                                                    MOV start, eax }
                                            // некоторый код
                                            _asm { RDTSC
                                                    SUB eax, start
                                                    MOV elapsed, eax }
      Такты CPU    ±1 нc       580 лет      LARGE_INTEGER start, end;
      (64 бита)    (1 ГГц)                  __int64 elapsed;
                                            QueryPerformanceCounter(&start);
                                            // некоторый код
                                            QueryPerformanceCounter(&end);
                                            elapsed = end.QuadPart –
                                                start.QuadPart;

                                                                               9
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Outline
           Введение
               Тестирование производительности
           Архитектура современных процессоров
               Особенности
               Типичное устройство
               Кэш
           Оптимизация
               Выбор алгоритмов
               Ветвления
               Память
               Циклы
               Медленные операции
               Вещественные вычисления
           SIMD
           Многопоточность


                                                  10
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Особенности архитектуры
              современных процессоров

           Конвейерная обработка инструкций
           CISC на уровне машинных инструкций, но
            RISC на уровне микроархитектуры
           Суперскалярная архитектура
           Выполнение команд вне очереди (out-of-
            order execution)
           Большое время доступа к основной памяти
            и наличие быстродействующего кэша
           Наличие набора векторных инструкций
           Многоядерность

                                                      11
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Схема процессора
                                                   Выборка инструкций и
                Предсказание ветвлений
                                                    предекодирование



                                                    Очередь иструкций

                                                                                                  Кэш второго уровня

                                                      Декодирование



                                               Буфер инструкций (возможно
                                                 исполнение вне очереди)



                                                      Планировщик



                        ALU
                                           ALU             ALU
                       Branch
                                          FP Add        FP Multiply         Load            Store
                     MMX/SSE/FP
                                         MMX/SSE         MMX/SSE
                        Move



                                                                             Кэш первого уровня



                                                                                                                       12
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                 Архитектура многоядерного
                 процессора
            Hyper-Threading                                       Intel Core Duo, Core 2 Duo
            Architectural state   Architectural state             Architectural state   Architectural state
                       Execution engine                            Execution engine     Execution engine
               Local APIC            Local APIC                       Local APIC           Local APIC
                     Кэш второго уровня                                    Кэш второго уровня
                 Интерфейс с шиной данных                              Интерфейс с шиной данных



             Intel Core 2 Quad
             Architectural state      Architectural state   Architectural state    Architectural state
              Execution engine         Execution engine     Execution engine        Execution engine
                  Local APIC               Local APIC          Local APIC               Local APIC
                        Кэш второго уровня                           Кэш второго уровня
                   Интерфейс с шиной данных                      Интерфейс с шиной данных



                                                                                                              13
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                       Устройство кэша L1
                                                                Размер строки  64 байта
                         Каналы (ways)                          Pentium 4, Xeon
                       0    1    2     3                             объем кэша  816 КБ
                   0
                                                                     48 каналов, 32 ряда
                   1                       1 набор (set)
                   2                                            Core, Pentium M
                   3                                                  объем кэша  32 КБ
    Ряды (rows)




                                                                  
                   4                       1 строка (line)
                   5                                                 8 каналов, 64 ряда




                  30
                  31




                                                                                             14
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Производительность
             инструкций
                                                                         Пропускная
      Инструкция                                           Латентность   способность
      Сложение, вычитание, логические операции (AND,       0,5           0,5
      OR, XOR), сравнение, переход, доступ к памяти
      Работа со стеком, логические сдвиги, SIMD-доступ к   1             1
      памяти, 64-битные целочисленные SIMD-операции
      (MMX, за исключением EMMS); модуль, сравнение,
      сложение и вычитание для вещественных чисел
      128-битные целочисленные SIMD-операции; SIMD-        2             2
      операции над вещественными числами одинарной и
      двойной точности за исключением деления и корня
      Целочисленное умножение                              15            4
      Целочисленное деление; деление и квадратный          23            23
      корень для вещественных чисел одинарной точности
      (32 бита)

                                                                                       15
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
             Производительность
             инструкций
                                                                        Пропускная
      Инструкция                                          Латентность   способность
      SIMD деление и квадратный корень для                32            32
      вещественных чисел одинарной точности
      Деление и квадратный корень для вещественных        38            38
      чисел двойной точности (64 бита)
      Деление и квадратный корень для вещественных        43            43
      чисел повышенной точности (80 бит)
      SIMD деление и квадратный корень для                62            62
      вещественных чисел двойной точности
      Трансцендентные функции (синус, косинус, тангенс,   130170       130170
      арктангенс)




                                                                                      16
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Outline
           Введение
               Тестирование производительности
           Архитектура современных процессоров
               Особенности
               Типичное устройство
               Кэш
           Оптимизация
               Выбор алгоритмов
               Ветвления
               Память
               Циклы
               Медленные операции
               Вещественные вычисления
           SIMD
           Многопоточность


                                                  17
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Алгоритмы

      Основные характеристики алгоритмов:
       Вычислительная сложность

       Инструкции, требуемые для
        реализации
       Объем используемой памяти

       Характер доступа к памяти

       Зависимости по данным


                                            18
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Зависимости по данным и
              параллелизм инструкций
                                0       5          10         15         20   25
  Пример 1:
  a = u * v;                                a=u∙v
  b = w * x;                                          b=w∙x
  C = y * z;
                                                                   c=y∙z

                          Пропускная способность              Латентность


                                0       5          10         15         20   25       30   35
  Пример 2:
  a = (w * x) * (y * z);                 t1 = w ∙ x
                                                      t2 = y ∙ z
                                                                              a = t1 ∙ t2


                                                        Зависимость по
                                                           данным


                                                                                            19
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
               Предсказание условных
               переходов
           Предсказываемый процессором условный переход:
      for (int i = 0; i < 100; ++i) {
          if (i % 2 == 0)
              doEven();
          else
              doOdd();
      }

           Переход случаен  сложно предсказуем:
      for (int i = 0; i < 100; ++i) {
          side = flipCoin();
          if (side == HEADS)
              ++numHeads;
          else
              ++numTails;
      }


                                                            20
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Виды переходов
           Условные переходы, исполняемые впервые
               Переходы вперед
               Переходы назад
           Условные переходы, которые уже
            исполнялись
           Вызов функции и возврат из функции
           Косвенные вызовы функций и переходы
            (указатели на функции и таблицы
            переходов)
           Безусловные переходы

                                                     21
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                Удаление ветвлений с
                помощью инструкции CMOV

           Код использующий условный переход
               На С
                if (val > 255)
                    val = 255;
               Аналог на ассемблере
                cmp val, 255
                jle skipSet
                mov val, 255
            skipSet:
           Код использующий инструкцию CMOV
                mov     eax,   val
                mov     ebx,   255
                cmp     eax,   ebx
                cmovg   eax,   ebx
                mov     val,   eax
               Быстрее в 2,5 раза в случае случайного перехода
               Эквивалентны при 1 неверно предсказанном переходе из 100

                                                                           22
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                  Удаление ветвлений при
                  использовании SIMD

           Использование бинарных масок
          val:                        const:                  mask:
            240   258   130   262 >   255   255   255   255 = FFFF FFFF FFFF FFFF


     result = (val & ~mask) | (const & mask);

           Вычисление минимума и максимума
          val:                        const:                      result:
min(        240   258   130   262 ,   255   255   255   255 ) =   240   255   130   255




                                                                                          23
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Удаление ветвлений
      for (int i = 0; i < size; ++i) {
          alpha = getAlpha(src[i]);
          if (alpha == 255)
              dst[i] = src[i];
          else if (alpha != 0)
              dst[i] = blend(src[i], dst[i], alpha);
      }




                                                       24
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Таблицы переходов
      switch (val) {                        if (val == 'A') {
          case 'A':                             // …
              // вероятность      95%       }
          break;                            else if (val == 'B') {
          case 'B':                             // …
              // вероятность      4%        }
          break;                            else switch (val) {
          case 'C':                             case 'C':
              // вероятность      0,5%               // …
          break;                                break;
          case 'D':                             case 'D':
              // вероятность      0,5%               // …
          break;                                break;
      }                                     }



                                                                     25
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



              Использование кэша

           Обязательная загрузка (compulsory
            load)
           Загрузка из-за нехватки объема кэша
            (capacity load)
           Загрузка вследствие конфликта
            (conflict load)
           Эффективность кэша (cache efficiency)

                                                    26
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Программная
              предвыборка
      Ассемблерная инструкция Описание
      PREFETCHNTA                   Выборка данных для единичного доступа в
                                    режиме чтения
      PREFETCH0                     Выборка в кэши всех уровней для чтения/записи
      PREFETCH1                     Выборка в кэши L2 и L3, но не L1
      PREFETCH2                     Выборка только в кэш третьего уровня

      Пример с использованием встраиваемых функций:
            for (int i = 0; i < size; ++i) {
                array[i] = fn(array[i]);
                _mm_prefetch(array[i + 16], MM_HINT_T0);
            }


                                                                                    27
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



               Выравнивание данных
           Доступ к данным, попадающим в различные строки кэша
            вызывает дополнительные накладные расходы
           Большинство современных векторных инструкций не
            работают с невыровненными данными

      Тип данных                             Выравнивание
      1 байт, 8 бит, BYTE                    Произвольное выравнивание
      2 байта, 16 бит, WORD                  2 байта
      4 байта, 32 бита, DWORD                4 байта
      8 байт, 64 бита, QWORD                 8 байт
      10 байт, 80 бит, (вещественное число   16 байт
      расширенной точности)
      16 байт, 128 бит                       16 байт

                                                                         28
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
              Оптимизация
              использования памяти
           Применение алгоритмов требующих меньшее
            количество памяти
           Повышение эффективности использования кэша
           Предварительная загрузка данных в кэш
           Применение инструкций, позволяющих избежать
            накладных расходов RFO
           Устранение конфликтов кэша
           Устранение проблем связанных с нехваткой
            объема кэша
           Увеличение работы проводимых над одними
            данным


                                                          29
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Циклы
      Достоинства                           Недостатки
      Требуют меньшее количество            Привносят накладные расходы в виде
      инструкций                            инструкций, реализующих цикл
      Нет необходимости повторно            Добавляется один неверно
      декодировать инструкции               предсказанный переход
      Процессор может автоматически         Циклы вносят дополнительные
      разворачивать циклы                   зависимости по данным
      Компилятор может оптимизировать       Без SIMD-оптимизации вычисления,
      циклы за счет использования SIMD-     которые могли бы выполняться
      инструкций                            параллельно, выполняются
                                            последовательно




                                                                                 30
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Разворачивание циклов
      Исходный цикл:                        Вариант 2:
      sum = 0;                              a = b = c = d = 0;
      for (int i = 0; i < 16; ++i)          for (int i = 0; i < 16; i += 4) {
          sum += array[i];                      a += array[i];
                                                b += array[i + 1];

      Вариант 1:                                c += array[i + 2];
                                                d += array[i + 3];
      sum = 0;                              }
      for (int i   = 0; i < 16; i += 4) {   sum = a + b + c + d;
          sum +=   array[i];
          sum +=   array[i + 1];
          sum +=   array[i + 2];
          sum +=   array[i + 3];
      }




                                                                                31
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                          Разворачивание циклов

                                                         Единственная возможная цель
                          Развернуть цикл и смешать
                                                            разворачивания цикла —
                          инструкции для достижения
                                                         избавление от зависимостей по
       Длина тела цикла




                            большего параллелизма
                                                                    данным




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



                                            Количество итераций

                                                                                          32
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



               Инварианты цикла
           Инвариантные арифметические выражения
             for (int x = 0; x < length; ++x)
                 array[x] = x * val / 3;
           Инвариантные вызовы функций
             for (int x = 0; x < length; ++x)
                 array[x] += x * val * foo(y) / 3;
           Инвариантные ветвления
             for (int i = 0; i < size; ++i)
                 if (blend == 255)
                     dest[i] = src1[i];
                 else if (blend == 0)
                     dest[i] = src2[i];
                 else
                     dest[i] = (src1[i] * blend +
                                src2[i] * (255 - blend)) / 255;



                                                                  33
CS MSU Graphics & Media Lab (Video Group)
FIX for
 Only ME
 Maxus 



             Loop fusion
     Исходный код:                              Преобразованный вариант:
     for (int   i   = 0;   i   < length; ++i)   for (int i = 0; i < length; ++i) {
         x[i]   =   a[i]   +   b[i];                x[i] = a[i] + b[i];
     for (int   i   = 0;   i   < length; ++i)       y[i] = b[i] + c[i];
         y[i]   =   b[i]   +   c[i];            }




                                                                                     34
CS MSU Graphics & Media Lab (Video Group)
FIX for
 Only ME
 Maxus 



             Unroll and jam
     for (int i = 0; i < h; ++i) {             for (int i = 0; i < h / n; i += n) {
         t = c[i];                                 for (int j = 0; j < w; ++j) {
         for (int j = 0; j < w; ++j) {                 c[i] += a[i][j] * b[j];
             t += a[i][j] * b[j];                      c[i + 1] += a[i + 1][j] * b[j];
         }                                             // …
         c[i] = t;                                     c[i + n - 1] +=
     }                                                      a[i + n - 1][j] * b[j];
                                                   }
     for (int i = 0; i < h / n; i += n) {      }
         for (int j = 0; j < w; ++j) {
             c[i] += a[i][j] * b[j];
         }
         for (int j = 0; j < w; ++j) {
             c[i + 1] += a[i + 1][j] * b[j];
         }
         // …
         for (int j = 0; j < w; ++j) {
             c[i + n - 1] +=
                 a[i + n - 1][j] * b[j];
         }
     }




                                                                                         35
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                 Memory Address
                 Dependencies

            1.
                    Прочитать данные
                      по адресу src                     Типичный цикл:
                                                 for (i = 0; i < n; ++i) {
            2.    Провести вычисления
                                                     *dst = f(*src);
                                                     ++dst;
                                                     ++src;
                   Записать данные по
            3.         адресу dst                }

                 Вычислить новые адреса
                                           Нет
                                                        Проблемы:
            4.         src и dst
                                                          Неизвестный адрес
                                                           для загрузки данных
            5.   Увеличить счѐтчик цикла
                                                          Неизвестный адрес
                                                           для сохранения
            6.       Цикл закончен?                        данных

                                                                                 36
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



              Медленные инструкции
           Инструкции с большой задержкой
           Инструкции с маленькой пропускной
            способностью
           Ожидание готовности операндов
           Отсутствие свободных слотов
            выполнения
           Инструкции, останавливающие
            исполнение вне очереди
                                                37
CS MSU Graphics & Media Lab (Video Group)
FIX for
 Only ME
 Maxus 



              Lookup Tables
          Lookup-таблица должна быть организована так, чтобы
           полностью находиться в кэше
          Таблица должна быть как можно меньшего размера
          Талица должна заменять как можно больше
           вычислений
          Пример: преобразование ARGBAYYY




                                                                38
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                 Floating point
                                                       Производительность деления в тактах
                  Размер,
      Точность    бит       Диапазон                   FDIV      DIVSS/DIVSD   DIVPS/DIVPD
      Single      32        1,18·10-383,4·1038        23        22            32
      Double      64        2,23·10-3081,79·10308     38        35            62
      Extended    80        3,37·10-49321,18·104932   43                     



           Режимы приведения к целому:
               Округление к ближайшему целому
               Округление «вниз»
               Округление «вверх»
               Отбрасывание дробной части

                                                                                             39
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                   SIMD
                    Возможна
               оптимизация за счет
  Нет                 SIMD?                 Да                         Точность


                                      Целочисленные                            Применима ли
                                     или вещественные                          целочисленная
                                       вычисления?                              арифметика?
                                                                                                      Нет

                 Целочисленные          Вещественные                                Да
                                                              Почему                              Применима ли
                                                           вещественная                            одинарная
                                                           арифметика?                              точность?
                                                                                                                          Нет

                                                                                                      Да
                                                                                Использовать      Использовать
                                                        Производительность     целочисленную       одинарную
                                                                                 арифметику         точность




            Преобразование данных для                                                                       Завершение
                                              Написание SIMD-кода            Оптимизация памяти
               использования SIMD                                                                           оптимизации




                                                                                                                           40
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 
                             Использование SIMD-
                             инструкций


                                                  Встраиваемые
                              Ассемблер
                                                функции (intrinsics)
        Производительность




                                                                        Автоматическая
                                                                         векторизация

                                                  Специальные
                                                  контейнеры и
                                              алгоритмы для С++ и
                                                      т. д.




                                    Простота программирования/переносимость


                                                                                         41
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                MMX, SSE, SSE2
           MMX
               64-битные регистры
               Работа с упакованными байтами, словами и двойными словами
           SSE (Streaming SIMD Extensions)
               128-битные регистры
               Работа с упакованными вещественными числами одинарной
                точности
               Управление кэшированием
               Упакованные 64-битные целые
           SSE2
               Работа с упакованными вещественными числами двойной
                точности
               Аналоги инструкций MMX для 128-битных регистров
               «Перемешивание» данных


                                                                            42
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                SSE3, SSSE3, SSE4.1
           SSE3
               «Горизонтальные» вычисления
               Преобразование к целому (x87)
               Поддержка синхронизации потоков
           SSSE3 (Supplemental Streaming SIMD Extensions 3)
               Вычисление модуля
               Побайтовое «перемешивание»
           SSE4.1
               Скалярное произведение
               SAD



                                                               43
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Outline
           Введение
               Тестирование производительности
           Архитектура современных процессоров
               Особенности
               Типичное устройство
               Кэш
           Оптимизация
               Выбор алгоритмов
               Ветвления
               Память
               Циклы
               Медленные операции
               Вещественные вычисления
           SIMD
           Многопоточность


                                                  44
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Многопоточность
                                                                    Ts

       Последовательное выполнение          (1  p)Ts                    pTs


                                                        Tp




                                                         Overhead
                                                                     pTs 2
       Параллельное выполнение              (1  p)Ts
                                                                     pTs 2


                                              Tp
              Tp  1  p Ts  s  c
                               pT                                   p
                                                    1 p 
                                N             Ts                    N


                                                                               45
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Многопоточность
           Идеи применения многопоточности
               Распараллеливание задач, занимающих
                существенное время
               Сбалансированность потоков
               Синхронизация
               Минимизация объема «общей» памяти
               Определение количества потоков
           Методы распараллеливания задач
               Functional decomposition
               Domain decomposition

                                                      46
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Domain decomposition




                                            47
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



                Основные проблемы
           Накладные расходы на управление
            потоками
           Короткие циклы
           False-sharing
           Пропускная способность памяти
           Эффективность использования кэша
           Накладные расходы на синхронизацию
               Spin-waits
           Processor affinity
               Cache ping-pong

                                                 48
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



               OpenMP
           Исходный вариант
      void serialApplyFoo(float a[], size_t n) {
          for (size_t i = 0; i < n; ++i)
              foo(a[i]);
      }
           Использование OpenMP
      void parallelApplyFoo(float a[], size_t n) {
          opm_set_num_threads(NUM_THREADS);
          #pragma omp parallel for shared(a)
          for (size_t i = 0; i < n; ++i)
              foo(a[i]);
      }




                                                     49
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Threading Building Blocks
      class ApplyFoo {
          float *const m_a;
      public:
          void operator() (const blocked_range<size_t> &r) const {
              float *a = m_a;
              for (size_t i = r.begin(); i != r.end(); ++i)
                  foo(a[i]);
          }
          ApplyFoo(float a[]) : m_a(a) {}
      };

      void parallelApplyFoo(float a[], size_t n) {
          parallel_for(blocked_range<size_t>(0, n, grainSize),
              ApplyFoo(a));
      }


                                                                     50
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



             Способ разбиения




      void parallelApplyFoo(float a[], size_t n) {
          parallel_for(blocked_range<size_t>(0, n), ApplyFoo(a),
              auto_partitioner());
      }


                                                                   51
CS MSU Graphics & Media Lab (Video Group)
Only for
 Maxus 



               Список литературы
           The Software Optimization Cookbook, Intel
            Press, 2002
           Concepts of High Performance Computing,
            Georg Hager, Gerhard Wellein, 2008
           Intel 64 and IA-32 Architectures Optimization
            Reference Manual, 2007,
            http://developer.intel.com/design/processor/manuals/248966.pdf
           Intel Threading Building Blocks,
            http://threadingbuildingblocks.org/
           OpenMP, http://www.openmp.org/


                                                                             52
CS MSU Graphics & Media Lab (Video Group)

Методы оптимизации вычислений на CPU

  • 1.
    Методы ускорения программ иалгоритмов Илья Цветков Video Group CS MSU Graphics & Media Lab
  • 2.
    Only for Maxus Содержание  Введение  Тестирование производительности  Архитектура современных процессоров  Особенности  Типичное устройство  Кэш  Оптимизация  Выбор алгоритмов  Ветвления  Память  Циклы  Медленные операции  Вещественные вычисления  SIMD  Многопоточность 2 CS MSU Graphics & Media Lab (Video Group)
  • 3.
    Only for Maxus Тезисы оптимизации  Нельзя оптимизировать программу/функцию не запуская ее  Необходимо тестирование на различных машинах  Один из возможных путей оптимизации  удаление дополнительных возможностей  Отладочные сборки программы не пригодны для тестирования производительности  Оптимизация далеко не всегда требует написание ассемблерного кода  Тестирование должно быть частью процесса разработки 3 CS MSU Graphics & Media Lab (Video Group)
  • 4.
    Only for Maxus Методы ускорения  Оптимизация с учетом особенной конкретной архитектуры  Векторные инструкции  Распараллеливание задачи  Hyper-Threading  Многоядерные процессоры  Применение специализированных процессоров  GPU  nVidia CUDA, Intel Larabbee 4 CS MSU Graphics & Media Lab (Video Group)
  • 5.
    Only for Maxus Процесс оптимизации Создание Отыскание Определение Модификация теста «горячих» точек причины программы Тестирование производительности «Горячие» точки (hotspots):  места наибольшей активности программы или функции;  под активностью может пониматься:  время, затрачиваемое на исполнение некоторого участка кода,  количество неверно предсказанных ветвлений,  количество промахов кэша;  показывают области требующие оптимизации. 5 CS MSU Graphics & Media Lab (Video Group)
  • 6.
    Only for Maxus Процесс оптимизации Создание Отыскание Определение Модификация теста «горячих» точек причины программы Тестирование производительности Инструментарий:  средства измерения времени исполнения программы/функции;  программный профайлер:  sampling,  instrumenting;  оптимизирующий компилятор. 6 CS MSU Graphics & Media Lab (Video Group)
  • 7.
    Only for Maxus Тестирование производительности Свойства теста производительности:  Повторяемость результатов  Отражение характерного поведения программы  Простота использования  Адекватность результатов  Совмещение с тестирование функциональности  Измерение времени исполнения  Полное покрытие программы  Точность измерений 7 CS MSU Graphics & Media Lab (Video Group)
  • 8.
    Only for Maxus Измерение времени исполнения Таймер Точность Максимум Пример использования Функции ±1 c 73 года time_t start, elapsed; библиотеки Start = time(NULL); языка С // некоторый код elapsed = time(NULL) – start; Windows ±10 мc 49 дней DWORD start, elapsed; multimedia Start = timeGetTime(); timer // некоторый код elapsed = timeGetTime() – start; 8 CS MSU Graphics & Media Lab (Video Group)
  • 9.
    Only for Maxus Измерение времени исполнения Таймер Точность Максимум Пример использования Такты CPU ±1 нc 4,29 с DWORD start, elapsed; (32 бита) (1 ГГц) _asm { RDTSC MOV start, eax } // некоторый код _asm { RDTSC SUB eax, start MOV elapsed, eax } Такты CPU ±1 нc 580 лет LARGE_INTEGER start, end; (64 бита) (1 ГГц) __int64 elapsed; QueryPerformanceCounter(&start); // некоторый код QueryPerformanceCounter(&end); elapsed = end.QuadPart – start.QuadPart; 9 CS MSU Graphics & Media Lab (Video Group)
  • 10.
    Only for Maxus Outline  Введение  Тестирование производительности  Архитектура современных процессоров  Особенности  Типичное устройство  Кэш  Оптимизация  Выбор алгоритмов  Ветвления  Память  Циклы  Медленные операции  Вещественные вычисления  SIMD  Многопоточность 10 CS MSU Graphics & Media Lab (Video Group)
  • 11.
    Only for Maxus Особенности архитектуры современных процессоров  Конвейерная обработка инструкций  CISC на уровне машинных инструкций, но RISC на уровне микроархитектуры  Суперскалярная архитектура  Выполнение команд вне очереди (out-of- order execution)  Большое время доступа к основной памяти и наличие быстродействующего кэша  Наличие набора векторных инструкций  Многоядерность 11 CS MSU Graphics & Media Lab (Video Group)
  • 12.
    Only for Maxus Схема процессора Выборка инструкций и Предсказание ветвлений предекодирование Очередь иструкций Кэш второго уровня Декодирование Буфер инструкций (возможно исполнение вне очереди) Планировщик ALU ALU ALU Branch FP Add FP Multiply Load Store MMX/SSE/FP MMX/SSE MMX/SSE Move Кэш первого уровня 12 CS MSU Graphics & Media Lab (Video Group)
  • 13.
    Only for Maxus Архитектура многоядерного процессора Hyper-Threading Intel Core Duo, Core 2 Duo Architectural state Architectural state Architectural state Architectural state Execution engine Execution engine Execution engine Local APIC Local APIC Local APIC Local APIC Кэш второго уровня Кэш второго уровня Интерфейс с шиной данных Интерфейс с шиной данных Intel Core 2 Quad Architectural state Architectural state Architectural state Architectural state Execution engine Execution engine Execution engine Execution engine Local APIC Local APIC Local APIC Local APIC Кэш второго уровня Кэш второго уровня Интерфейс с шиной данных Интерфейс с шиной данных 13 CS MSU Graphics & Media Lab (Video Group)
  • 14.
    Only for Maxus Устройство кэша L1  Размер строки  64 байта Каналы (ways)  Pentium 4, Xeon 0 1 2 3  объем кэша  816 КБ 0  48 каналов, 32 ряда 1 1 набор (set) 2  Core, Pentium M 3 объем кэша  32 КБ Ряды (rows)  4 1 строка (line) 5  8 каналов, 64 ряда 30 31 14 CS MSU Graphics & Media Lab (Video Group)
  • 15.
    Only for Maxus Производительность инструкций Пропускная Инструкция Латентность способность Сложение, вычитание, логические операции (AND, 0,5 0,5 OR, XOR), сравнение, переход, доступ к памяти Работа со стеком, логические сдвиги, SIMD-доступ к 1 1 памяти, 64-битные целочисленные SIMD-операции (MMX, за исключением EMMS); модуль, сравнение, сложение и вычитание для вещественных чисел 128-битные целочисленные SIMD-операции; SIMD- 2 2 операции над вещественными числами одинарной и двойной точности за исключением деления и корня Целочисленное умножение 15 4 Целочисленное деление; деление и квадратный 23 23 корень для вещественных чисел одинарной точности (32 бита) 15 CS MSU Graphics & Media Lab (Video Group)
  • 16.
    Only for Maxus Производительность инструкций Пропускная Инструкция Латентность способность SIMD деление и квадратный корень для 32 32 вещественных чисел одинарной точности Деление и квадратный корень для вещественных 38 38 чисел двойной точности (64 бита) Деление и квадратный корень для вещественных 43 43 чисел повышенной точности (80 бит) SIMD деление и квадратный корень для 62 62 вещественных чисел двойной точности Трансцендентные функции (синус, косинус, тангенс, 130170 130170 арктангенс) 16 CS MSU Graphics & Media Lab (Video Group)
  • 17.
    Only for Maxus Outline  Введение  Тестирование производительности  Архитектура современных процессоров  Особенности  Типичное устройство  Кэш  Оптимизация  Выбор алгоритмов  Ветвления  Память  Циклы  Медленные операции  Вещественные вычисления  SIMD  Многопоточность 17 CS MSU Graphics & Media Lab (Video Group)
  • 18.
    Only for Maxus Алгоритмы Основные характеристики алгоритмов:  Вычислительная сложность  Инструкции, требуемые для реализации  Объем используемой памяти  Характер доступа к памяти  Зависимости по данным 18 CS MSU Graphics & Media Lab (Video Group)
  • 19.
    Only for Maxus Зависимости по данным и параллелизм инструкций 0 5 10 15 20 25 Пример 1: a = u * v; a=u∙v b = w * x; b=w∙x C = y * z; c=y∙z Пропускная способность Латентность 0 5 10 15 20 25 30 35 Пример 2: a = (w * x) * (y * z); t1 = w ∙ x t2 = y ∙ z a = t1 ∙ t2 Зависимость по данным 19 CS MSU Graphics & Media Lab (Video Group)
  • 20.
    Only for Maxus Предсказание условных переходов  Предсказываемый процессором условный переход: for (int i = 0; i < 100; ++i) { if (i % 2 == 0) doEven(); else doOdd(); }  Переход случаен  сложно предсказуем: for (int i = 0; i < 100; ++i) { side = flipCoin(); if (side == HEADS) ++numHeads; else ++numTails; } 20 CS MSU Graphics & Media Lab (Video Group)
  • 21.
    Only for Maxus Виды переходов  Условные переходы, исполняемые впервые  Переходы вперед  Переходы назад  Условные переходы, которые уже исполнялись  Вызов функции и возврат из функции  Косвенные вызовы функций и переходы (указатели на функции и таблицы переходов)  Безусловные переходы 21 CS MSU Graphics & Media Lab (Video Group)
  • 22.
    Only for Maxus Удаление ветвлений с помощью инструкции CMOV  Код использующий условный переход  На С if (val > 255) val = 255;  Аналог на ассемблере cmp val, 255 jle skipSet mov val, 255 skipSet:  Код использующий инструкцию CMOV mov eax, val mov ebx, 255 cmp eax, ebx cmovg eax, ebx mov val, eax  Быстрее в 2,5 раза в случае случайного перехода  Эквивалентны при 1 неверно предсказанном переходе из 100 22 CS MSU Graphics & Media Lab (Video Group)
  • 23.
    Only for Maxus Удаление ветвлений при использовании SIMD  Использование бинарных масок val: const: mask: 240 258 130 262 > 255 255 255 255 = FFFF FFFF FFFF FFFF result = (val & ~mask) | (const & mask);  Вычисление минимума и максимума val: const: result: min( 240 258 130 262 , 255 255 255 255 ) = 240 255 130 255 23 CS MSU Graphics & Media Lab (Video Group)
  • 24.
    Only for Maxus Удаление ветвлений for (int i = 0; i < size; ++i) { alpha = getAlpha(src[i]); if (alpha == 255) dst[i] = src[i]; else if (alpha != 0) dst[i] = blend(src[i], dst[i], alpha); } 24 CS MSU Graphics & Media Lab (Video Group)
  • 25.
    Only for Maxus Таблицы переходов switch (val) { if (val == 'A') { case 'A': // … // вероятность 95% } break; else if (val == 'B') { case 'B': // … // вероятность 4% } break; else switch (val) { case 'C': case 'C': // вероятность 0,5% // … break; break; case 'D': case 'D': // вероятность 0,5% // … break; break; } } 25 CS MSU Graphics & Media Lab (Video Group)
  • 26.
    Only for Maxus Использование кэша  Обязательная загрузка (compulsory load)  Загрузка из-за нехватки объема кэша (capacity load)  Загрузка вследствие конфликта (conflict load)  Эффективность кэша (cache efficiency) 26 CS MSU Graphics & Media Lab (Video Group)
  • 27.
    Only for Maxus Программная предвыборка Ассемблерная инструкция Описание PREFETCHNTA Выборка данных для единичного доступа в режиме чтения PREFETCH0 Выборка в кэши всех уровней для чтения/записи PREFETCH1 Выборка в кэши L2 и L3, но не L1 PREFETCH2 Выборка только в кэш третьего уровня Пример с использованием встраиваемых функций: for (int i = 0; i < size; ++i) { array[i] = fn(array[i]); _mm_prefetch(array[i + 16], MM_HINT_T0); } 27 CS MSU Graphics & Media Lab (Video Group)
  • 28.
    Only for Maxus Выравнивание данных  Доступ к данным, попадающим в различные строки кэша вызывает дополнительные накладные расходы  Большинство современных векторных инструкций не работают с невыровненными данными Тип данных Выравнивание 1 байт, 8 бит, BYTE Произвольное выравнивание 2 байта, 16 бит, WORD 2 байта 4 байта, 32 бита, DWORD 4 байта 8 байт, 64 бита, QWORD 8 байт 10 байт, 80 бит, (вещественное число 16 байт расширенной точности) 16 байт, 128 бит 16 байт 28 CS MSU Graphics & Media Lab (Video Group)
  • 29.
    Only for Maxus Оптимизация использования памяти  Применение алгоритмов требующих меньшее количество памяти  Повышение эффективности использования кэша  Предварительная загрузка данных в кэш  Применение инструкций, позволяющих избежать накладных расходов RFO  Устранение конфликтов кэша  Устранение проблем связанных с нехваткой объема кэша  Увеличение работы проводимых над одними данным 29 CS MSU Graphics & Media Lab (Video Group)
  • 30.
    Only for Maxus Циклы Достоинства Недостатки Требуют меньшее количество Привносят накладные расходы в виде инструкций инструкций, реализующих цикл Нет необходимости повторно Добавляется один неверно декодировать инструкции предсказанный переход Процессор может автоматически Циклы вносят дополнительные разворачивать циклы зависимости по данным Компилятор может оптимизировать Без SIMD-оптимизации вычисления, циклы за счет использования SIMD- которые могли бы выполняться инструкций параллельно, выполняются последовательно 30 CS MSU Graphics & Media Lab (Video Group)
  • 31.
    Only for Maxus Разворачивание циклов Исходный цикл: Вариант 2: sum = 0; a = b = c = d = 0; for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; i += 4) { sum += array[i]; a += array[i]; b += array[i + 1]; Вариант 1: c += array[i + 2]; d += array[i + 3]; sum = 0; } for (int i = 0; i < 16; i += 4) { sum = a + b + c + d; sum += array[i]; sum += array[i + 1]; sum += array[i + 2]; sum += array[i + 3]; } 31 CS MSU Graphics & Media Lab (Video Group)
  • 32.
    Only for Maxus Разворачивание циклов Единственная возможная цель Развернуть цикл и смешать разворачивания цикла — инструкции для достижения избавление от зависимостей по Длина тела цикла большего параллелизма данным Развернуть цикл, избавиться от Полностью развернуть цикл зависимостей по данным, возможно, применить SIMD Количество итераций 32 CS MSU Graphics & Media Lab (Video Group)
  • 33.
    Only for Maxus Инварианты цикла  Инвариантные арифметические выражения for (int x = 0; x < length; ++x) array[x] = x * val / 3;  Инвариантные вызовы функций for (int x = 0; x < length; ++x) array[x] += x * val * foo(y) / 3;  Инвариантные ветвления for (int i = 0; i < size; ++i) if (blend == 255) dest[i] = src1[i]; else if (blend == 0) dest[i] = src2[i]; else dest[i] = (src1[i] * blend + src2[i] * (255 - blend)) / 255; 33 CS MSU Graphics & Media Lab (Video Group)
  • 34.
    FIX for OnlyME Maxus  Loop fusion Исходный код: Преобразованный вариант: for (int i = 0; i < length; ++i) for (int i = 0; i < length; ++i) { x[i] = a[i] + b[i]; x[i] = a[i] + b[i]; for (int i = 0; i < length; ++i) y[i] = b[i] + c[i]; y[i] = b[i] + c[i]; } 34 CS MSU Graphics & Media Lab (Video Group)
  • 35.
    FIX for OnlyME Maxus  Unroll and jam for (int i = 0; i < h; ++i) { for (int i = 0; i < h / n; i += n) { t = c[i]; for (int j = 0; j < w; ++j) { for (int j = 0; j < w; ++j) { c[i] += a[i][j] * b[j]; t += a[i][j] * b[j]; c[i + 1] += a[i + 1][j] * b[j]; } // … c[i] = t; c[i + n - 1] += } a[i + n - 1][j] * b[j]; } for (int i = 0; i < h / n; i += n) { } for (int j = 0; j < w; ++j) { c[i] += a[i][j] * b[j]; } for (int j = 0; j < w; ++j) { c[i + 1] += a[i + 1][j] * b[j]; } // … for (int j = 0; j < w; ++j) { c[i + n - 1] += a[i + n - 1][j] * b[j]; } } 35 CS MSU Graphics & Media Lab (Video Group)
  • 36.
    Only for Maxus Memory Address Dependencies 1. Прочитать данные по адресу src  Типичный цикл: for (i = 0; i < n; ++i) { 2. Провести вычисления *dst = f(*src); ++dst; ++src; Записать данные по 3. адресу dst } Вычислить новые адреса Нет  Проблемы: 4. src и dst  Неизвестный адрес для загрузки данных 5. Увеличить счѐтчик цикла  Неизвестный адрес для сохранения 6. Цикл закончен? данных 36 CS MSU Graphics & Media Lab (Video Group)
  • 37.
    Only for Maxus Медленные инструкции  Инструкции с большой задержкой  Инструкции с маленькой пропускной способностью  Ожидание готовности операндов  Отсутствие свободных слотов выполнения  Инструкции, останавливающие исполнение вне очереди 37 CS MSU Graphics & Media Lab (Video Group)
  • 38.
    FIX for OnlyME Maxus  Lookup Tables  Lookup-таблица должна быть организована так, чтобы полностью находиться в кэше  Таблица должна быть как можно меньшего размера  Талица должна заменять как можно больше вычислений  Пример: преобразование ARGBAYYY 38 CS MSU Graphics & Media Lab (Video Group)
  • 39.
    Only for Maxus Floating point Производительность деления в тактах Размер, Точность бит Диапазон FDIV DIVSS/DIVSD DIVPS/DIVPD Single 32 1,18·10-383,4·1038 23 22 32 Double 64 2,23·10-3081,79·10308 38 35 62 Extended 80 3,37·10-49321,18·104932 43    Режимы приведения к целому:  Округление к ближайшему целому  Округление «вниз»  Округление «вверх»  Отбрасывание дробной части 39 CS MSU Graphics & Media Lab (Video Group)
  • 40.
    Only for Maxus SIMD Возможна оптимизация за счет Нет SIMD? Да Точность Целочисленные Применима ли или вещественные целочисленная вычисления? арифметика? Нет Целочисленные Вещественные Да Почему Применима ли вещественная одинарная арифметика? точность? Нет Да Использовать Использовать Производительность целочисленную одинарную арифметику точность Преобразование данных для Завершение Написание SIMD-кода Оптимизация памяти использования SIMD оптимизации 40 CS MSU Graphics & Media Lab (Video Group)
  • 41.
    Only for Maxus Использование SIMD- инструкций Встраиваемые Ассемблер функции (intrinsics) Производительность Автоматическая векторизация Специальные контейнеры и алгоритмы для С++ и т. д. Простота программирования/переносимость 41 CS MSU Graphics & Media Lab (Video Group)
  • 42.
    Only for Maxus MMX, SSE, SSE2  MMX  64-битные регистры  Работа с упакованными байтами, словами и двойными словами  SSE (Streaming SIMD Extensions)  128-битные регистры  Работа с упакованными вещественными числами одинарной точности  Управление кэшированием  Упакованные 64-битные целые  SSE2  Работа с упакованными вещественными числами двойной точности  Аналоги инструкций MMX для 128-битных регистров  «Перемешивание» данных 42 CS MSU Graphics & Media Lab (Video Group)
  • 43.
    Only for Maxus SSE3, SSSE3, SSE4.1  SSE3  «Горизонтальные» вычисления  Преобразование к целому (x87)  Поддержка синхронизации потоков  SSSE3 (Supplemental Streaming SIMD Extensions 3)  Вычисление модуля  Побайтовое «перемешивание»  SSE4.1  Скалярное произведение  SAD 43 CS MSU Graphics & Media Lab (Video Group)
  • 44.
    Only for Maxus Outline  Введение  Тестирование производительности  Архитектура современных процессоров  Особенности  Типичное устройство  Кэш  Оптимизация  Выбор алгоритмов  Ветвления  Память  Циклы  Медленные операции  Вещественные вычисления  SIMD  Многопоточность 44 CS MSU Graphics & Media Lab (Video Group)
  • 45.
    Only for Maxus Многопоточность Ts Последовательное выполнение (1  p)Ts pTs Tp Overhead pTs 2 Параллельное выполнение (1  p)Ts pTs 2 Tp Tp  1  p Ts  s  c pT p  1 p  N Ts N 45 CS MSU Graphics & Media Lab (Video Group)
  • 46.
    Only for Maxus Многопоточность  Идеи применения многопоточности  Распараллеливание задач, занимающих существенное время  Сбалансированность потоков  Синхронизация  Минимизация объема «общей» памяти  Определение количества потоков  Методы распараллеливания задач  Functional decomposition  Domain decomposition 46 CS MSU Graphics & Media Lab (Video Group)
  • 47.
    Only for Maxus Domain decomposition 47 CS MSU Graphics & Media Lab (Video Group)
  • 48.
    Only for Maxus Основные проблемы  Накладные расходы на управление потоками  Короткие циклы  False-sharing  Пропускная способность памяти  Эффективность использования кэша  Накладные расходы на синхронизацию  Spin-waits  Processor affinity  Cache ping-pong 48 CS MSU Graphics & Media Lab (Video Group)
  • 49.
    Only for Maxus OpenMP  Исходный вариант void serialApplyFoo(float a[], size_t n) { for (size_t i = 0; i < n; ++i) foo(a[i]); }  Использование OpenMP void parallelApplyFoo(float a[], size_t n) { opm_set_num_threads(NUM_THREADS); #pragma omp parallel for shared(a) for (size_t i = 0; i < n; ++i) foo(a[i]); } 49 CS MSU Graphics & Media Lab (Video Group)
  • 50.
    Only for Maxus Threading Building Blocks class ApplyFoo { float *const m_a; public: void operator() (const blocked_range<size_t> &r) const { float *a = m_a; for (size_t i = r.begin(); i != r.end(); ++i) foo(a[i]); } ApplyFoo(float a[]) : m_a(a) {} }; void parallelApplyFoo(float a[], size_t n) { parallel_for(blocked_range<size_t>(0, n, grainSize), ApplyFoo(a)); } 50 CS MSU Graphics & Media Lab (Video Group)
  • 51.
    Only for Maxus Способ разбиения void parallelApplyFoo(float a[], size_t n) { parallel_for(blocked_range<size_t>(0, n), ApplyFoo(a), auto_partitioner()); } 51 CS MSU Graphics & Media Lab (Video Group)
  • 52.
    Only for Maxus Список литературы  The Software Optimization Cookbook, Intel Press, 2002  Concepts of High Performance Computing, Georg Hager, Gerhard Wellein, 2008  Intel 64 and IA-32 Architectures Optimization Reference Manual, 2007, http://developer.intel.com/design/processor/manuals/248966.pdf  Intel Threading Building Blocks, http://threadingbuildingblocks.org/  OpenMP, http://www.openmp.org/ 52 CS MSU Graphics & Media Lab (Video Group)