系统的heap 是整个操作系统全局共享的,以windows 为例,抄作heap 的API 有GlobalAlloc和GlobalFree。 C和C++的 malloc 和 new 最后实现还是调用的windows的 GlobalAlloc API。多核,多线程环境中,两个并行run 的线程经常有同时调用 heap 操作, heap 是全局共享一个线程访问全局heap的时候另一个线程就不可能去访问(OS API heap操作的实现保证了这一点),本来应该并行的多个线程就因为Heap 操作thread safe 的实现,强制变成了串行执行。这种现象就叫做 Heap contention。
在4核和以下的系统里面, 一般的经验是只有heap contention 而没有其他毛病的多线程程序,4核上面总归会比关掉两个核的两核系统有30% 左右的性能提高。 然而当核数再加一倍的时候, 在8核的系统上, 8核上的性能比关掉6个核还要差。 最简单的例子程序如下:
#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);
}
这么严重的问题应该怎样解决呢, 答案将在下一个文章中给出。
本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/131462,如需转载请自行联系原作者