Презентацию к лекции Вы можете скачать здесь.
Одним из популярных вариантов использования современных ЭВМ является выполнение мультимедийных приложений. Кодирование и декодирование видео- и аудиоданных, обработка изображений и сигналов зачастую требует значительного объема вычислительных ресурсов, что может накладывать определенные ограничения на используемое программное обеспечение. Другим немаловажным фактором, требующим эффективного использования вычислительных ресурсов, является время автономной работы мобильного устройства (ноутбука, планшетного компьютера, смартфона).
Необходимо отметить, что многие высокоуровневые алгоритмы обработки мультимедиа данных в итоге сводятся к базовым операциям над простыми структурами (например, массивами), прич?м производительность этих операций существенно влияет на производительность алгоритма в целом. Некоторые из базовых операций могут использоваться различными высокоуровневыми алгоритмами. Исходя из этих факторов, представляется целесообразным выполнять оптимизацию именно низкоуровневых функций. Данный подход лежит в основе разработанной компанией Intel библиотеки Integrated Performance Primitives [ 1 ], которая представляет собой набор кроссплатформенных библиотек, содержащих большое количество низкоуровневых оптимизированных под Intel CPU функций, которые могут быть использованы при разработке различных мультимедийных приложений таких как:
Как было сказано выше, библиотека Intel IPP представляет собой набор оптимизированных реализаций базовых (низкоуровневых) операций (данные реализации поставляются в бинарном виде). Логически библиотеку можно разделить на 3 больших модуля: обработка сигналов (одномерных массивов), обработка изображений и видео, операции над матрицами небольшого размера и реалистичный рендеринг. Для того чтобы облегчить процесс разработки ПО с использованием библиотеки, отдельно в виде исходных кодов поставляются высокоуровневые API для аудио и видеокодеков, функций обработки изображений и речи. Данные API могут быть использованы при разработке собственных приложений. Графически модель использования библиотеки представлена на Рис. 1.
(рис 5.1) Структура и модель использования библиотеки Intel IPP
Имена функций в библиотеке Intel IPP имеют следующую структуру:
ipp<data-domain><name>|_<datatype>||_<descriptor>|(<parameters>)
Рассмотрим подробнее назначение отдельных частей в данной структуре.
<data-domain> - тип обрабатываемых данных:
Примеры: ipps, ippi, ippm, ippr
<name> = <operation>[_modifier] - имя функции:
Примеры: Copy, Malloc, DCTFwd_CToC (прямое дискретное косинус-преобразование, в котором входные и выходные значения являются комплексными)
<datatype> = <bit_depth><bit_interpretation> – тип обрабатываемых данных:
Intel IPP поддерживает следующие типы данных:
| Тип | Тип C/++ | Тип Intel IPP |
|---|---|---|
| 8u | unsigned char | Ipp8u |
| 8s | signed char | Ipp8s |
| 16u | unsigned short | Ipp16u |
| 16s | signed short | Ipp16s |
| 16sc | complex short | Ipp16sc |
| 32u | unsigned int | Ipp32u |
| 32s | signed int | Ipp32s |
| 32f | float | Ipp32f |
| 32fc | complex float | Ipp32fc |
| 64s | __int64 (long long) | Ipp64s |
| 64f | double | Ipp64f |
| 64fc | complex double | Ipp64fc |
В случае, если у функции есть несколько аргументов разных типов (или тип выходных данных отличается от типа входных данных), используется следующий формат типа обрабатываемых данных: <datatype> = <src1Datatype>[src2Datatype][dstDatatype]
<descriptor> - описание дополнительных особенностей данных, обрабатываемых функцией
Примеры:
M – используется маска, определяющая пиксели изображения, которые будут обработаны функцией
R – функция обрабатывает определенную область изображения (ROI – region of interest)
<parameters> – параметры функции; указываются в следующем порядке:
Рассмотрим функцию ippiCopy_8u_C3R. Согласно описанной выше структуре, данная функция копирует ( <name> = Copy) изображение (ippi, <data_domain> = i), элементами которого являются 8-битные целые числа без знака (<data_type> = 8u). Изображение является трехканальным (C3, <descriptor> = C3R), копирование осуществляется из заданной области изображения (R, <descriptor> = C3R).
Функции библиотеки 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.
Рассмотрим пример создания приложения, использующего библиотеку Intel IPP, в среде Microsoft Visual Studio 2010.
(рис 5.2) Создание решения для лабораторной работы
(рис 5.3) Добавление cpp файла в проект main.cpp.
#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);
}
(рис 5.4) Окно настроек проектаПрезентацию к лекции Вы можете скачать здесь.
Одним из популярных вариантов использования современных ЭВМ является выполнение мультимедийных приложений. Кодирование и декодирование видео- и аудиоданных, обработка изображений и сигналов зачастую требует значительного объема вычислительных ресурсов, что может накладывать определенные ограничения на используемое программное обеспечение. Другим немаловажным фактором, требующим эффективного использования вычислительных ресурсов, является время автономной работы мобильного устройства (ноутбука, планшетного компьютера, смартфона).
Необходимо отметить, что многие высокоуровневые алгоритмы обработки мультимедиа данных в итоге сводятся к базовым операциям над простыми структурами (например, массивами), прич?м производительность этих операций существенно влияет на производительность алгоритма в целом. Некоторые из базовых операций могут использоваться различными высокоуровневыми алгоритмами. Исходя из этих факторов, представляется целесообразным выполнять оптимизацию именно низкоуровневых функций. Данный подход лежит в основе разработанной компанией Intel библиотеки Integrated Performance Primitives [ 1 ], которая представляет собой набор кроссплатформенных библиотек, содержащих большое количество низкоуровневых оптимизированных под Intel CPU функций, которые могут быть использованы при разработке различных мультимедийных приложений таких как:
Как было сказано выше, библиотека Intel IPP представляет собой набор оптимизированных реализаций базовых (низкоуровневых) операций (данные реализации поставляются в бинарном виде). Логически библиотеку можно разделить на 3 больших модуля: обработка сигналов (одномерных массивов), обработка изображений и видео, операции над матрицами небольшого размера и реалистичный рендеринг. Для того чтобы облегчить процесс разработки ПО с использованием библиотеки, отдельно в виде исходных кодов поставляются высокоуровневые API для аудио и видеокодеков, функций обработки изображений и речи. Данные API могут быть использованы при разработке собственных приложений. Графически модель использования библиотеки представлена на Рис. 1.
(рис 5.1) Структура и модель использования библиотеки Intel IPP
Имена функций в библиотеке Intel IPP имеют следующую структуру:
ipp<data-domain><name>|_<datatype>||_<descriptor>|(<parameters>)
Рассмотрим подробнее назначение отдельных частей в данной структуре.
<data-domain> - тип обрабатываемых данных:
Примеры: ipps, ippi, ippm, ippr
<name> = <operation>[_modifier] - имя функции:
Примеры: Copy, Malloc, DCTFwd_CToC (прямое дискретное косинус-преобразование, в котором входные и выходные значения являются комплексными)
<datatype> = <bit_depth><bit_interpretation> – тип обрабатываемых данных:
Intel IPP поддерживает следующие типы данных:
| Тип | Тип C/++ | Тип Intel IPP |
|---|---|---|
| 8u | unsigned char | Ipp8u |
| 8s | signed char | Ipp8s |
| 16u | unsigned short | Ipp16u |
| 16s | signed short | Ipp16s |
| 16sc | complex short | Ipp16sc |
| 32u | unsigned int | Ipp32u |
| 32s | signed int | Ipp32s |
| 32f | float | Ipp32f |
| 32fc | complex float | Ipp32fc |
| 64s | __int64 (long long) | Ipp64s |
| 64f | double | Ipp64f |
| 64fc | complex double | Ipp64fc |
В случае, если у функции есть несколько аргументов разных типов (или тип выходных данных отличается от типа входных данных), используется следующий формат типа обрабатываемых данных: <datatype> = <src1Datatype>[src2Datatype][dstDatatype]
<descriptor> - описание дополнительных особенностей данных, обрабатываемых функцией
Примеры:
M – используется маска, определяющая пиксели изображения, которые будут обработаны функцией
R – функция обрабатывает определенную область изображения (ROI – region of interest)
<parameters> – параметры функции; указываются в следующем порядке:
Рассмотрим функцию ippiCopy_8u_C3R. Согласно описанной выше структуре, данная функция копирует ( <name> = Copy) изображение (ippi, <data_domain> = i), элементами которого являются 8-битные целые числа без знака (<data_type> = 8u). Изображение является трехканальным (C3, <descriptor> = C3R), копирование осуществляется из заданной области изображения (R, <descriptor> = C3R).
Функции библиотеки 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.
Рассмотрим пример создания приложения, использующего библиотеку Intel IPP, в среде Microsoft Visual Studio 2010.
(рис 5.2) Создание решения для лабораторной работы
(рис 5.3) Добавление cpp файла в проект main.cpp.
#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);
}
(рис 5.4) Окно настроек проектаДля получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.