OMP_NUM_THREADS = 4 还是 2 对于多线程双核 CPU 在什么条件下更好?

计算科学 并行计算
2021-12-10 00:25:11

我正在运行我的 Fortran 95 数字代码,在双核多线程 CPU Intel CORE i3 中,它的结构大多数时候很容易并行化,而不仅仅是在一些关键的 DO 语句之前添加相应的 OpenMP 指令。Ubuntu“看到”四个 CPU(显然因为有 2 个内核,每个内核都模拟两个内核),我已经读到“多线程”功能意味着,在某些条件下,每个 CPU 的行为可能接近两个独立的CPU 本身,但不是一般的。我在某处听说,在某些情况下,四个并行线程在这种机器上的性能可能比两个差。

一般而言,我的机器几乎可以作为真正的 4 核工作的编码或任务类型是什么,在哪些情况下模拟它可能不是一个好主意(例如,将 OMP_NUM_THREADS 变量设置为 2 而不是 4 )?


编辑:换句话说,根据另一个帖子中的这个不错的答案,我的机器与所涉及的数值任务相关的最佳硬件线程数是多少,前提是,虽然它是双核 CPU,但它有那种“多线程”的能力吗?

3个回答

社区还没有真正得出关于何时值得或不值得的结论。我确实在我的 4 核笔记本电脑上使用 'make -j8' 进行编译,它比使用 'make -j4' 更快,但是使用 8 个线程运行简单的多线程程序并没有比使用 4 个线程快多少。唯一真正找到的方法出来就是试试

超线程利用 cpu 部件(如寄存器)的重复,使 cpu “看起来”像操作系统和其他硬件的两倍核心。FPU 等实际执行单元不重复。这意味着如果您的程序受 CPU 限制,即 FPU 已满负荷运行 2 个线程,那么您将看不到任何改进。

因此,您只能期望任何一种配置都能将性能提高几十个百分点。英特尔声称在某些情况下增加了大约 30%,但即使他们承认这取决于应用程序。了解它将如何影响您的代码的唯一真正方法是对其进行分析。进行两次相同大小的非平凡运行并对它们进行计时。我个人使用的代码中,数值参数的微小变化会极大地改变代码随线程数缩放的方式。

一般来说,如果你有一个取决于先前操作的结果的操作,那么超线程是好的,因为这样,管道可以被来自另一个线程的操作填充,直到需要继续的信息在那里。另一方面,您将每个线程的可用缓存大小减半,因此根据您的内存使用情况,这可能会对性能产生巨大影响。