编译器从业者 (Beta): 使用zlib库压缩数据

来源:百度文库 编辑:神马文学网 时间:2024/04/30 16:19:43
skip to main |skip to sidebar编译器从业者 (Beta)
不靠谱的世界里 | http://compiler.yingbo.com
星期三, 十一月 29, 2006
使用zlib库压缩数据
在分析程序性能的时候,经常需要获得程序的运行踪迹,比如程序的访存踪迹,跳转指令踪迹等。如果评测程序的动态指令数很多,则生成的踪迹数据也会很大。以SPEC2000整点程序(使用train输入)为例,动态指令数通常在几十到几百亿条左右,以4 bytes来描述一条指令的话,生成的踪迹大小为十G级别,那么这套测试集的踪迹需要百G的磁盘空间。
为了控制踪迹数据的大小,可以使用zlib库来压缩踪迹数据。zlib提供了一批函数来压缩数据。有多种方案可以选择。
使用gzwrite(gzFile file, const voidp buf, unsigned len)函数
设置一个buf来存放踪迹,比如64M大小(主要是为了减少压缩函数的调用次数),当buf满的时候,调用gzwrite压缩该buf并写到踪迹文件中。注意该函数的每次调用都会对整个文件进行一次整体处理,因此最终生成的压缩文件可以用gzip解压。
对踪迹数据进行分析的时候,可以调用gzread()函数读取。
使用compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)和fwrite()
之所以提出这种方法,主要是第一种方法在32位机器上无法处理超过2G的大文件,会报file limit exceeds错误,这可能是因为gzwrite没考虑大文件的处理(发信问zlib作者,还没回我)。因此就辗转使用fwrite来解决大文件处理问题。因为通过-D_FILE_OFFSET_BITS=64参数可以使得fwrite和fread处理超过2G的大文件。
具体的使用还是设置一个buf,通过compress压缩后,调用fwrite写到踪迹文件中。考虑到将来要读取,因此也要把压缩前后数据的大小也写到文件中。读取的时候,先fread读出每个压缩块数据的大小,再读取相应大小的压缩数据,使用uncompress()解压。
目前的评测发现对指令踪迹的压缩率通常大于10,有些情况下达到40;对评测时间的影响可以接受,时间为原来的1.5-2倍。
 
发表者 Yingbo 以7:24 上午 
标签:编译器
0 评论:
发表评论
较旧的文章主页
订阅:帖子评论 (Atom)
我的简介
YingboGCC, Programming Language, C ...
查看我的完整个人资料
 
不吃米饭 blog.yingbo.com 
分享色彩 photo.yingbo.com 
 
标签
编译器 (6)gcc (3)c语言 (2)书籍 (1)
 
Links
GCC   Glibc   Bintuils

 
 
©2006 compiler.yingbo.com       京ICP备06004668号