将TBB parallel_for应用于40核工作站时性能下降

时间:2014-03-30 00:10:58

标签: multithreading performance tbb downgrade parallel-for

我已经在4核(8线程)笔记本电脑i7-3920XM上以这种方式实现了TBB parallel_for。完成计算需要大约15秒,每个核心的CPU使用率约为70%。如果我为作业初始化固定数量的线程,例如g_nthreads = 4,则需要12秒。没关系,我对默认方式感到满意。

// g_nthreads = 8, on 4-core(8 threads) laptop
int g_nthreads = tbb::task_scheduler_init::default_num_threads(); 
tbb::task_scheduler_init tbb_init(g_nthreads); 

...

// k iterates from 0 to N-1
tbb::parallel_for(0, N, [tool, pos, rock,...] (int k)  {
...
Func( tool, pos, k, rock ,...);
} 
)

问题是如果我在20核(40线程)工作站Xeon E5-2680上使用相同的代码,性能会迅速降级到30秒,其中TBB初始化40个线程自动工作。在这种情况下整体的CPU使用率为12%,并且只有一半显示在运行中。当我再次将线程数修复为4时,需要13秒,但整体CPU使用率仍然是~12%。

看起来这项工作并不一定需要在20核(40线程)计算机上运行这么多线程,并且将作业分成40个任务的开销在性能上占主导地位。

如何最大限度地提高CPU使用率并提高20核(40线程)计算机的性能? Func()是需要大量计算的EM函数。

更新

最后,我在40核计算机上实现了100%CPU的性能。

1,程序将线程固定到核心,这通常不应该是正确的方式。让TBB自己决定切换内核会更好。

2,强制程序使用tbbmalloc.dll和tbbmalloc_proxy.dll,可以在VS中设置:    项目属性 - C / C ++ - 高级 - 强制包含文件 - > " TBB / tbbmalloc_proxy.h&#34 ;.这两个DLL用于TBB内存管理。

0 个答案:

没有答案