Heap contention ----- 4核以上系统的超级性能杀手 终极篇 问题解决

作者: 白极 (Intel) (6 篇文章) 日期: 2008-07-30 在 9:42 下午

上次给大家卖了了官子, 提出了一个问题, 一直没有给出结果, 同学们看得也着急,等得一直冒汗。  我老人家也绝对不是故意的, 最近工作太忙,  直到今天终于由一个空隙,赶快给出答案。

同学们再看看代码,
#pragma omp parallel for

for(i = 0;i < loop_num; i++)

{

char * block;

block = (char *)malloc(block_size);

double result = 0;

for(j = 0; j < 100000; j++)

result += j^2;

free(block);

}

在8核的系统上, 8核上的性能比关掉6个核还要差。

真是邪了门了。

有没有同学想出办法了, 有加分了哦。 下次我一定建议让版主同学给抢答的同学加分,分数可以换奖品!!!!!!!!
现在公布答案。

系统的heap 是整个操作系统全局共享的,以windows 为例,  微软没有聪明到帮程序员做到系统的heap 也不全局共享(全局共享在软件开发中绝对不是一个好东西),那么我们程序员自己动手。

问题陈述。
多个线程共享了系统的heap。

问题关键:

多个线程如果自己都有自己private 的系统heap, 你不用我的, 我不用你的, 大家互补干啥, 这个样子,  即使heap 是全局的,  没人来抢着征用,也就和私有heap 一样了
修改:
setthreadnum(CPU_num);
#pragma omp parallel for
for(i = 0 ; i <  CPU_num ;i++)
{
block[CPU_num] = (char *)malloc(block_size);
}
for(i = 0;i < loop_num; i++)

{

char * block;
//in the thread use the private global heap
current_thread = getnumthread();
do something to block[current_thread ] ;

double result = 0;

for(j = 0; j < 100000; j++)

result += j^2;

}

for(i = 0; i < CPU_num; i++)
free(block[i]);

yeah 搞定, 这样一来性能飙升啊, 牛起来一片红。

写完收工

分类: 多核技术

评论 (2) 评论 RSS 提要

作者: yl0002 日期: 八月 5th, 2008 在 7:19 下午
这种东西也要写篇文章说明一下啊。
不就是少了一个锁吗?
没有锁与等待的多线程当然是最好的了。这个还用说啊。

作者: 杜伟 (Intel) 日期: 八月 7th, 2008 在 6:58 上午
这是一些英特尔工程师同大家分享的心得,我们也欢迎各位高手分享您在多核平台上的经验啊。


您认为怎么样?

名称 (必需)

电子邮件 (必需;不会显示在此页面上)

您的 URL (可选)

评论 (必需)