Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 861 / 36 | Длительность: 14:11:00
Лекция 5:

Введение в библиотеку IPP

1.4. Инициализация библиотеки. Выделение и освобождение памяти.

Функции библиотеки Intel IPP оптимизированы под широкий набор архитектур. Для выбора оптимальной реализации для среды, в которой выполняется программа, необходимо в е? начале вызвать следующие функции (в зависимости от типа используемой линковки)

    IppStatus ippStaticInit(void) 
    

Функция определяет тип используемого процессора и выбирает наиболее подходящий для данного процессора статический код. Данная функция применима лишь при статической линковке.

IppStatus ippInit(void))

Функция определяет тип используемого процессора и выбирает наиболее подходящий для данного процессора код.

Одним из факторов, влияющих на производительность функций библиотеки Intel IPP, является использование выровненных данных. Для выделения и освобождения памяти, выровненной по 32 байт, под произвольные данные используются следующие функции:

void* ippMalloc(int length) 
void ippFree(void* ptr)     
    

Для выделения данных под одномерные массивы (сигналы) используется следующее семейство функций:

Ipp<datatype>* ippsMalloc_<datatype>(int len)     
    

которое выделяет массив, состоящий из элементов типа <datatype> длины len.

Для освобождения памяти, выделенной при помощи ippsMalloc необходимо использовать функцию ippsFree.

При работе с изображениями/видео память под обрабатываемые данные выделяется при помощи функций вида

Ipp<datatype>* ippiMalloc_<mod>(int widthPixels, int 
heightPixels, int* pStepBytes)     
    
  • widthPixels – ширина изображения (в пикселях).
  • heightPixels – высота изображения (в пикселях).
  • pStepBytes (выходной параметр) – расстояние между последовательными строками в изображении (в байтах).
  • <mod> – число каналов в изображении и формат данных (например, 8u_C3 – трехканальное изображение, интенсивность каждого пикселя описывается unsigned char)

Память, выделенную с помощью ippiMalloc, необходимо освобождать с использованием функции ippiFree.

1.5. Вопросы производительности

1.6. Создание приложения в среде Microsoft Visual Studio 2010

Рассмотрим пример создания приложения, использующего библиотеку Intel IPP, в среде Microsoft Visual Studio 2010.

  1. Запустите приложение Microsoft Visual Studio 2010.
  2. В меню File выполните команду New\rightarrowProject….
  3. Как показано на рис. 2, в диалоговом окне New Project в типах проекта выберите Win32, в шаблонах Win32 Console Application, в поле Name введите название проекта (ipp_demo), в поле Location укажите путь к папке, в которой будут сохранены с лабораторными работами. Нажмите OK.
    Создание решения для лабораторной работы

    Рис. 5.2. Создание решения для лабораторной работы
  4. В диалоговом окне Win32 Application Wizard нажмите Next (или выберите Application Settings в дереве слева) и установите флаг Empty Project. Нажмите Finish.
  5. В окне Solution Explorer в папке Source Files выполните команду контекстного меню Add\rightarrowNew Item…. В дереве категорий слева выберите Code, в шаблонах справа – C++ File (.cpp), в поле Name введите имя файла main.
    Добавление cpp файла в проект

    Рис. 5.3. Добавление cpp файла в проект
  6. Нажмите Add. В результате выполненной последовательности действий в окне редактора кода Visual Studio будет открыт пустой файл main.cpp.
  7. Введите исходный код программы. Данное приложение инициализирует библиотеку, выделяет память под три одномерных массива a, b и c, заполняет массивы a и b данными, вычисляет поэлементную сумму этих массивов и помещает результат в массив с, печатает результат и освобождает память, выделенную под массивы.
    #include "ipp.h" 
    #include <stdio.h> 
    void main() 
    { 
      int n = 5; 
      ippInit(); 
      Ipp32f* a = ippsMalloc_32f(n); 
      Ipp32f* b = ippsMalloc_32f(n); 
      Ipp32f* c = ippsMalloc_32f(n); 
      for (int i = 0; i < n; i++) 
      { 
        a[i] = (float)i; 
        b[i] = (float)(10 - i); 
      } 
      ippsAdd_32f(a, b, c, n); 
      for (int i = 0; i < n; i++) 
      { 
        printf("%.3f + %.3f = %.3f\n",a[i],b[i], c[i]); 
      } 
      ippsFree(a); 
      ippsFree(b); 
      ippsFree(c); 
    }     
        
  8. Выполните команду контекстного меню Properties, чтобы получить доступ к настройкам проекта. Откройте вкладку Configuration Properties\rightarrowIntel Performance Libraries\rightarrowUse IPP . Выберите один из предлагаемых способов линковки (Shared DLL, Single-threaded static library, Multi-threaded static library).
    Окно настроек проекта

    Рис. 5.4. Окно настроек проекта
  9. Запустите компиляцию и сборку приложения.
Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?