Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Лекция 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).

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

Сергей Кротов
Сергей Кротов
Россия
Дмитрий Донсков
Дмитрий Донсков
Россия, Москва, Московский Авиационный Институт