且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-10-03 18:52:50

上次给大家卖了了官子, 提出了一个问题, 一直没有给出结果, 同学们看得也着急,等得一直冒汗。  我老人家也绝对不是故意的, 最近工作太忙,  直到今天终于由一个空隙,赶快给出答案。
同学们再看看代码,
#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 搞定, 这样一来性能飙升啊, 牛起来一片红。
写完收工


本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130766,如需转载请自行联系原作者