在双核上运行Huffman压缩的性能

信谦 2008-05-19 10:31:39
大家好啊 ,我用OpenMP实现了Huffman压缩文本文件程序,运行环境是Intel双核,
但是很奇怪,发现并行性能还不如串行的好。
我想的原因可能是负载不平衡,因为我用了很多的任务队列;
还有一种可能是读文件和写文件是不能并行的,所以造成瓶颈。

有高人可以帮我指点一下吗,我们快要检测代码了。
谢谢
...全文
134 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
intel_www 2008-05-28
  • 打赏
  • 举报
回复
对MakeHuffmanCode的调用是否是在另一个循环中?如果是的话,这里的thread overhead会过大,导致并行版本比串行更慢。
信谦 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Intel_CG 的回复:]
建议用Intel Thread Profiler检查负载平横。 请贴出用OpenMP的代码,方便讨论。或去premier.intel.com提交问题
[/Quote]
比如一个生成Huffman码的函数:
void MakeHuffmanCode(PHuffNode hnode,int deep) //生成Huffman码
{
static char hcode[256]={0}; //每次调用均清0
static int ncnt = 0;
BOOL IsChild = TRUE; //用来标记是否为叶节点
if(hnode->lChild || hnode->rChild)
{
hnode->arrIndex = ncnt;
m_fhead.push_back(*hnode);
ncnt++;
}
#pragma intel omp parallel taskq
{
#pragma intel omp task
{
if(hnode->lChild != NULL)
{
hcode[deep] = '0'; //左边为0,右边为1
MakeHuffmanCode(hnode->lChild,deep+1);
IsChild = FALSE;
}
}
#pragma intel omp task
{
if(hnode->rChild != NULL)
{
hcode[deep] = '1';
MakeHuffmanCode(hnode->rChild,deep+1);
IsChild = FALSE;
}
}
}
if(IsChild) //一个字符的编码结束
{
hcode[deep]='\0';
HuffCode[hnode->cKey] = hcode;
}
}
还有其他很多函数的WHILE循环都是用任务队列实现的。
我再用Intel Thread Profiler检测一下负载平衡。
希望大家有建议提出来
谢谢了!!
Intel_CG 2008-05-19
  • 打赏
  • 举报
回复
建议用Intel Thread Profiler检查负载平横。 请贴出用OpenMP的代码,方便讨论。或去premier.intel.com提交问题




567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧