多线程(openMP) - 有多少并行线程

时间:2012-04-16 16:36:14

标签: c++ multithreading parallel-processing multiprocessing openmp

我想知道是否可以在具有8个内核的硬件上同时运行8个以上的线程。

如果是这样,使用openMP并行化N个计算,我可以创建大小的块,比如N / 8,并且在每个线程中进一步分叉成(N / 8)/ 8个线程,可能还有更多?

当我嵌套并行化时,会发生什么?我还有8个可用的嵌套并行线程吗?

谢谢!

3 个答案:

答案 0 :(得分:10)

8个核心在给定时间点最多只能同时运行8个线程。但是,很大程度上取决于你的线程在做什么。如果他们正在执行CPU密集型任务,则不建议生成比核心数量多的线程(少数可能正常)。否则,过多的上下文切换和高速缓存未命中将开始降低性能。但是,如果存在大量I / O,则线程可能会被阻塞很多,而不是使用CPU,因此您可以并行运行更多的线程。

最重要的是,您需要根据您的特定环境来衡量特定情况下的效果。

另见this related thread

答案 1 :(得分:1)

现代cpu处理器可以选择超线程。
这意味着管道可以同时运行两个或多个线程。

因此可以同时运行的线程数是:
total_threads = num_procs *超线程因子

一般来说,超线程因子= 2。

对于CPU密集型工作负载,您必须运行total_threads。 对于io密集型工作负载,您应该使用total_threads * 2个线程。这样我们可以将一些线程的计算与其他线程的io重叠。

这些拇指规则是我遵循的。您可以根据工作量进行更改。

答案 2 :(得分:0)

首先,你不能运行8个以上的线程。 其次,如果没有其他工作可以采用嵌套并行性,因为openmp必须在这方面有很大的改进。