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

multithreading (openMP) - how many parallel threads

本文关键字:并行 线程 多少 openMP 多线程      更新时间:2023-10-16

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

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

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

谢谢!!

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

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

另请参阅此相关线程。

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

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

通常,超线程因子 = 2。

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

这些经验法则是我遵循的。您可以根据工作负载更改它。

首先,您不能运行超过 8 个线程。其次,如果没有其他工作,请诉诸嵌套并行性,因为 openmp 在这方面必须改进很多。