5

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

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

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

谢谢!!

4

3 回答 3

10

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

底线是,您需要在特定情况下,在特定环境中测量性能。

另请参阅此相关线程

于 2012-04-16T16:41:02.557 回答
2

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

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

通常,超线程因子 = 2。

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

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

于 2012-04-18T06:49:22.320 回答
0

首先,你不能运行超过 8 个线程。其次,如果没有其他方法,则求助于嵌套并行,因为 openmp 在这方面必须改进很多。

于 2012-04-16T19:10:21.043 回答