IPP为了让更多的用户能方便地使用,开发一些通用的例子代码。这些代码相当于一些个简单的应用,如jpeg编解码器,多媒体播放器,数据压缩应用中常用的zlib 库等等. 以基于IPP 的zlib 库为例,我们用IPP的文本处理函数,替换的zlib库源代码中相应的功能,经过编译,产生和原始的具有相同功能,相同接口的zlib 库。 由于我们对IPP的文本处理函数已经进行了优化,如果你用基于IPP 的zlib 库直接替换原有的zlib 库,你可以自然而然的得到性能的提升。
下面是一个例子:
linux 中常用工具叫bmp2png / png2bmp。它可以对BMP格式和PNG (便携式网络图形)格式的图像互相转换。 请访问它的主页b2p-home †。 它需要用到libpng 库和zlib 库。我们用基于IPP 的zlib 库替换原有的zlib 库。替换工作是非常简单的。一般仅需要修改一下Makefile文件,把IPP的zlib 库链接进来即可。
为了展示这个工作是如何进行的,并且也比较一下替换后的效果。我们做了以下测试:
硬件:Intel ® Core ® 2 Duo处理器。
软件:gcc 3.4.6, RedHat Linux 4
英特尔集成性能库5.3 Linux *版:
下载地址:http://www3.intel.com/cd/software/products/asmo-na/eng/perflib/302910.htm
英特尔集成性能库的示范代码: l_ipp - samples_b_5.3.020
下载地址:http://www3.intel.com/cd/software/products/asmo-na/eng/219967.htm
Linux的zlib的压缩库: zlib.1.2.3, 下载地址: http://www.zlib.net/
PNG library: libpng 1.2.18, 下载地址:http://sourceforge.net/projects/libpng/
BMP和PNG图像转换器: bmp2png 1.62, 下载地址:http://cetus.sakura.ne.jp/softlab/b2p-home/
1. 配置
为了测试bmp2png的性能,我们修改了一些部分的bmp2png †源代码。这步是可选。
以下的修改,可以帮助记录zlib的编码性能(包括指数像钟表每单元,编码时间(毫秒)等) 。
打开源代码bmp2png.c -
#tar xzvf bmp2png - 1.62.tar.gz
#cd bmp2png - 1.62
添加时间码记录在bmp2png.c
例如:
#include "common.h"
#include "bmphed.h"
#include "ippcore.h"
Ipp64u start, stop; // for record time
Ipp64u clocks=0;
char input_fn[FILENAME_MAX];
char output_fn[FILENAME_MAX];
int input_fn_size; // input file size
int output_fn_size; // output file size
int mhz; // for cpu frequency
int main(int argc, char *argv[]){
……
{ /* block */
FILE* file = fopen(input_fn, "rb");
fseek(file,0,SEEK_END);
input_fn_size = ftell(file);
fclose(file);
} /* block */
{ /* block */
FILE* file = fopen(output_fn, "rb");
fseek(file,0,SEEK_END);
output_fn_size = ftell(file);
fclose(file);
} /* block */
clocks = (stop - start);
ippGetCpuFreqMhz(&mhz);
printf("%s\t%f\t%d \t %f msec\n", input_fn, (float)((float)output_fn_size/(float)input_fn_size * 8), (int)(clocks/input_fn_size),(float)(clocks/(mhz*1000)));
return (failure > 255) ? 255 : failure;
}
2. 编译 (所有细节请参考《http://support.intel.com/support/performancetools/sb/CS-028264.htm
第1步:编译英特尔® IPP优化zlib库。
# tar xzvf l_ipp - samples_b_5.3.036.tgz
# ./build32.sh (或64位buildem64t.sh为应用程序)
如果成功编译,你就可以得到基于IPP的zlib库,请拷贝它到你的系统目录。
#cp ipp_zlib/linux32/libipp_z.a /usr/lib/.
第2步:编译libpng和libz库
2.1. 编译zlib的源代码
2.2 编译libpng1.2.18.tar.gz源代码
第3步:编译bmp2png转换器。
# tar -xzvf bmp2png-1.62.tar.gz
# cd bmp2png-1.62
为了用ipp_z库替换原有的libz 库,我们需要修改Makefile 文件如下:
# vi Makefile
Edit the Makefile as below
CFLAGS = -O2 -g -Wall -I/opt/intel/ipp/5.x/ia32/include
endif
ifndef LDFLAGS
LDFLAGS = -L../backup -L/opt/intel/ipp/5.x/ia32/sharedlib
endif
LIBS = -lpng -lipp_z -lippdc –lipps -lippcore –lguide –pthread –lm
编译bmp2png应用程序
# make
# su c “make intall’
经过编译,你就得到基于ipp_z库的bmp2png/png2bmp。
3. 运行应用
默认情况下, bmp2png/png2bmp是安装在/ usr/local/bin 目录下。比如你希望把一个bmp的图像转成png格式:
#source / opt/intel/ipp/5.x/ia32/tools/env/ippvars32.sh
# ./bmp2png -9 - oa.png ../jpeg_image/image1_1k.bmp
这样就转好了。 你可以看到你的当前目录下生成了一个png 文件。 你可以用一些linux 自带的图片浏览器看到这个图片。
同样你也可以转一个png格式的图片到bmp格式。
#./png2bmp a.png
4. 性能比较
bmp2png/png2bmp可以自动显示性能数据, 比如
OK a.png oooooooooooooooooooooooooooooooooooooooooooooooooooooooo
../JPEG_image/image1_1k.bmp 5.397046 489 543.000000 msec../jpeg_image/image1_1k.bmp
第一个数字5.397046 表示数据压缩率。每字节被压缩成了多少 bit,较小的,就越小越好。
第二个数字489 表示每个字节所花的时钟,越小越好。
第三个数字543ms :花在转换上的总时间(毫秒)。
我们对几个不同大小的图片进行了测试,记录下他们所需的时间(如下表所示)。 同原始的Linux * zlib相比,IPP zlib 压缩大约快了1.4倍,解压缩快了 1.1倍。
Image Size Encoding Time (Clockticks per Byte) Encoding speedup
(IPP vs png) Decoding Time
(Clockticks Per Byte Decoding
speedup
(IPP vs png)
libpng zlib1.2.3 IPP zlib libpng zlib1.2.3 IPP zlib
image1_160.bmp 160x120 530 423 125% 117 87 134%
image1_320.bmp 320x240 657 501 129% 93 77 121%
image1_640.bmp 640x480 617 487 126% 81 73 111%
image1_800.bmp 800x600 609 475 127% 81 72 113%
image1_1k.bmp 1024x768 620 485 128% 88 80 110%
image1_4k.bmp 4096x4096 1,646 959 172% 141 129 109%
Average 780 557.67 140% 100.16667 200.5 116%
(测试运行在英特尔Core 2 Duo 2.13 GHz处理器, 1.0gb RAM内存, Red HAT EL5. 你可以在英特尔®支持网站permier.intel.com下的"英特尔® IPP样品"目录里下载到测试图像。 当然,你也可以用你自己的png 或bmp 图片做测试。
优化注意事项
即使不是专门针对英特尔微处理器的优化,英特尔编译器也有可能无法为非英特尔微处理器实现相同程度的优化。这些优化包括 SSE2、SSE3 和SSSE3 指令集和其他优化。 英特尔不保证任何优化在非英特尔制造的微处理器上的可用性、功能或有效性。本产品中依赖于微处理器的优化旨在配合英特尔微处理器一起使用。不一定针对英特尔微架构的某些优化专为英特尔微处理器保留。请参见适用产品的“用户和参考指南”了解本注意事项中涵盖的特定指令集的更多相关信息。
注意事项修订版 #20110804