Intel_IPP 的基本使用方法

来源:互联网 发布:27岁转行做java 编辑:程序博客网 时间:2024/06/05 07:46

这是一个介绍IPP的文档,原文来自于因特尔的网站:https://software.intel.com/zh-cn/blogs/2011/09/15/intel_ipp


IPP - “Intel Integrated Performance Primitives” (Intel IPP )是一套跨平台的软件函数库,他提供了广泛的多媒体功能:音频解码器(例如: H263 、 MPEG-4 )、图像处理 (JPEG) 、信号处理、语音压缩(例如: G723 、 GSM 、 AMR )和加密机制。“Intel IPP” 包含各种的函数,用于进行向量与图像处理、颜色转换、过滤、分屏、设置域值、变换,以及算术、统计、几何与图形运算。对于每个函数, “Intel IPP” 均支持多种数据类型和分布,同时保持了数据结构的最小化,它提供了丰富的选项供用户在设计与优化应用程序时选用,不必再去编写特定代码。Intel IPP 针对大量的 Intel Microprocessor (微处理器)进行优化: Intel Pentium 4 处理器,采用 Intel Centrino 移动运算技术的 Intel Pentium M 处理器组件, Intel Itanium 2 处理器、 Intel Xeon 处理器以及采用 Intel XScale 技术的 Intel PCA 应用处理器。采用一套跨平台结构的通用 API ,使用者除了不需要担心平台兼容性的问题,更节省了开发成本以及研发时间,使用者可以轻轻松松移植原有应用程序。特性Intel IPP 功能优化多媒体函数· 不再需要以 Hard-Coding 方式针对特定的处理器进行优化· 提高应用程序的可靠性· 节省时间:内置调度器选择优化处理,并根据处理器自动调度特定的运行时代码· 在基于信号和图像的数据结构的特定约束方面,改善了应用程序的灵活性Intel IPP 节省开发时间“Intel Integrated Performance Primitives” 为软件应用程序提供了一个连接界面,它可以增强 Intel 最新微处理器的性能,同时还具有加速上市时间、降低开发成本等优势。您不必针对特定的处理器专门去编写代码,即可利用处理器的高级功能。许多使用 “Intel IPP” 的多媒体应用程序开发人员已经大大改善了他们的软件在 Intel 处理器上的性能。高度的灵活性给予您自由发挥的空间“Intel IPP” 函数库针对 Itanium 2 微处理器、 Intel Xeon 、 Pentium III 、 Pentium 4 处理器以及采用 Intel Centrino 移动计算技术的 Pentium M 处理器元件进行过优化。“Intel IPP” 还针对 Intel XScale 微处理器的 “Intel 个人客户端架构 ” ( Intel R PCA )进行优化。这一个应用程序开发界面 (API) 可以跨越许多平台使用,使得多媒体应用程序开发人员能够轻松实现跨品台兼容,并有助于降低开发成本。取得性能增强效果Intel IPP 提供优化功能,让使用者在最短的时间内能得到最佳的效能, Intel IPP4.1 提供更丰富的优化效能,


关于Intel IPP的基本使用方法来源:网络 |时间:2010-04-15 | 点击: 341次

   IPP是个好东西,里面的函数精而全,希望大家好好利用。因为IPP目前很少中文资料,我们只能靠自己摸索。下面就简单说说IPP在VC2005下的基本使用方法。

  假定你的IPP是安装在“D:\Intel\IPP”目录下。

  首先是配置VC2005的环境。打开VC2005后,点击菜单栏的“工具--选项”,在左侧找到“项目和解决方案--VC++目录”,在“可执行文件”的目录中添加“D:\Intel\IPP\bin”,在“包含文件”的目录中添加“D:\Intel\IPP\include”,在“库文件”中添加“D:\Intel\IPP\stublib”和“D:\Intel\IPP\lib”,确定即可。

  然后就是具体的在项目中使用IPP了。我们这次的项目主要是使用IPP的图像处理函数,这些函数的具体说明可以在“D:\Intel\IPP\doc\ippiman.pdf”这个文件中找到。函数的命名其实也是很有规律的,例如图像拷贝的函数,也就是手册里的“4.Image Data Exchange and Initialization Functions”中的Copy这一功能,对于不同的图像,应当使用不同的Copy函数,它的命名是这样的:首先是前缀“ippi”,所有图像处理的函数都以“ippi”开头;然后是功能名称“Copy”,连起来就是“ippiCopy”;之后连一个下划线和对应的模式“ippiCopy_”,那个“”替换成对应的颜色模式,例如“8u_C1R”,其中的“C1R”表示图像只有一个颜色通道,而“8u”表示每个象素的颜色的数据类型都是8位无符号数,也就是说这种图像是一个字节表示一个像素的。我们平时用的比较多的是“8u_C3R”,也就是三个颜色通道,每个通道的数据类型都是8位无符号数。但是显示的时候往往需要4个通道的,也就是除了RGB以外,还多了一个Alpha通道(透明度),这是因为我们的电脑一般都设成32位色深的。这时我们就需要把24位的图像转化成32位的,用“ippiCopy_8u_C3AC4R”这个函数就可以了。其中“8u_C3”就代表原始图像是8位无符号数据,3个通道,而AC4R就表示目标图像是带有Alpha通道的4通道图像。再看看函数的完整形式:

  其返回值是IppStatus,这个只要看看后面的返回值说明就知道啦,其实是一个整型值来的,只不过IPP里为了方便为这些值都用宏替换赋了名称,这里不再赘述。再来看看函数的参数,其中pSrc和pDst都是指针来的,pSrc就是源图像的图像数据指针,而pDst则指向目标图像的数据。前面的Ipp*中的datatype需要替换成相应的数据类型代码,例如8位无符号数,就是“Ipp8u*”了,大家看看手册前面的Function Naming中的Data Types那一节就知道了。而srcStep和dstStep则是指行扫描宽度,也就是图像的一行占用多少字节,这个参数在许多图像处理的函数中都会用到。例如一个320*240的8u_C3R图像,它的行扫描宽度就是320*(3*8)/8=960了。需要注意的是,行扫描宽度必须是4的整数倍,也就是DWORD对齐的,对于不满足4的整数倍的,则应补零对齐。那么上面那条公式就不能适用所有图像了,不过可使用下面的代码来正确计算行扫描宽度:

  (((width*channels*8)+31) >> 5) << 2

  其中width是图像的宽度,channels是通道数。

  最后的roiSize其实是一个IppiSize结构体来的,定义如下:

  typedef struct {

  int width;

  int height;

  } IppiSize;

  很明显就是图像的宽高了。这些结构体之类的基本类型定义都在手册的Function Naming中有详细说明。

  至于要使用这个函数需要包含哪个头文件呢?我们看到Copy函数的说明里后面有一句“The function ippiCopy is declared in the ippi.h file.”很好,#include "ippi.h"就是了。但是如果这样就直接编译,链接器便会告诉你有ippiCopy_8u_C3AC4R这么一个无法解析的外部符号。这是因为我们还没把库文件链接进来呢。ippi.h对应的库文件就是ippi.lib了。点击菜单的“项目--xxx属性--配置属性--链接器--输入”,在右边的“附加依赖项”中填入ippi.lib即可。若有多个库要使用,则用回车隔开。另外,为了兼容VC6.0的程序,在“项目--xxx属性--配置属性--常规”,右边的“字符集”应选择“多字节字符集”。

  而在“项目--xxx属性--配置属性--调试”中,“工作目录”应设为“D:\Intel\IPP\bin”,这样运行时程序才能调用IPP的动态链接库,或者把所需要的dll文件复制到你的Debug或Release文件夹下面也行。

  好了,至此我们的程序便可以编译运行了。感觉IPP用起来还是比较简便的,说明文档里也讲的很全,就是例子比较少,大家多实践实践应该比较容易上手的了。还是那句,边学边用,印象深,效率高。
0 0
原创粉丝点击