多核机器上的多个程序实例

Posted

技术标签:

【中文标题】多核机器上的多个程序实例【英文标题】:Multiple instances of program on multi-core machine 【发布时间】:2011-10-22 19:25:00 【问题描述】:

对于以下问题,我假设一台具有 2 个处理器的双核(每个处理器 2 个内核)机器;所以总共有4个“核心”。于是自然而然地出现了一些问题:

    假设我编写了一个简单的串行程序并将其构建在 Visual Studio 中,然后运行相同的程序两次,例如每次运行时使用不同的输入数据。他们会在同一个处理器上运行吗?还是不同的处理器?每个分配多少 RAM 内存?是 1 个处理器(2 个内核)上的 RAM 内存还是总 RAM?我相信这两个程序将在不同的处理器上运行,并且每个程序都应该有 1 个处理器(2 个内核)的 RAM 内存;但我不是 100% 确定的。 Linux 上的行为会有所不同吗?

    现在假设我的程序是使用分布式内存并行接口(例如 MPI)编写的,并且我在 np 参数中使用 2 个处理器运行它一次(比如说)。该程序会使用两个处理器(实际上是所有 4 个内核)吗?这是参数 -np 的最佳值吗?换句话说,如果我对 -np 3 或 -np 4 做同样的事情;假设没有额外的优势是否正确?再说一次,我是这么认为的,但我不是 100% 确定的。我还假设我可以高于 4(-np 5、-np 6 等)。在这种情况下,进程如何在 np > 4 时竞争内存?当 np > 4 时,性能会变差吗?我认为是的,也许这部分取决于问题的大小,但也不是 100% 肯定。

    接下来,假设我运行 MPI 构建的并行程序的两个实例,都使用 -np 2,每个实例都有不同的输入数据。首先,这可能吗?我认为它是并且它们每个都在两个处理器上运行?两个程序是如何同步的,又是如何分别依次竞争内存的?这应该至少部分基于启动程序的顺序,大概?

    最后,假设我的程序是使用共享内存并行接口(如 OpenMP)编写的,并且我运行了一次。我可以在多少个“线程”上运行它以充分利用共享内存并行性——是 2 个还是 4 个? (因为我有 2 个处理器,每个处理器有 2 个内核)。我猜是4;因为所有 4 个内核都是单个共享内存单元的一部分?那是对的吗?如果答案是 4;在超过 4 个线程上运行有意义吗?我不确定这是否有效(与 MPI 不同,我相信我们可以执行 -np 5、-np 6 等等)。

最后,假设我运行 2 个共享内存并行程序实例,每个实例都有不同的输入数据。我认为这是可能的,并且各个进程会以某种方式竞争内存,大概是按照程序启动的顺序?

【问题讨论】:

【参考方案1】:

它们在哪个处理器上运行完全取决于操作系统,并且取决于许多因素,包括同一台机器上发生的任何其他事情。不过,常见的情况是它们倾向于各自坐在一个核心上,偶尔会交换到不同的核心(“偶尔”可能意味着每秒几次甚至更频繁)。

Çores 在普通 PC 硬件上没有自己的 RAM,进程将获得所需的 RAM。

对于 MPI 进程,是的,您的并行度应该与核心数量相匹配(假设 CPU 繁重的工作负载)。如果两个 MPI 进程使用 -np 2 运行,它们将简单地消耗所有四个内核。增加任何东西,他们就会开始竞争。如上所述,RAM 与此无关,尽管缓存会在存在争用时受到影响。

这个“问题”太长了,所以我现在要停下来了。

【讨论】:

@Cantos:感谢您的回复;但是您愿意详细说明一下吗?该问题有 3 个类别(串行、MPI 和 openMP),看起来您只回答了第一个。但再次感谢! @Cantos:我看到你刚刚编辑了。无论如何,我承认这是一个很长的问题。再次感谢。 @user545591:最好的答案将来自您自己的测试。 @Cantos:你说得对,测试会给我与性能相关方面的答案,也许还有与核心使用相关的信息(TaskManager);但也希望有一些幕后细节。随意分享对这些主题的任何好的具体参考。谢谢!【参考方案2】:

@Marcelo 绝对正确,我想稍微扩展他的回答。

操作系统将根据系统中发生的其他情况和可用资源来确定线程在何时何地构成应用程序执行。每个应用程序都将在它自己的进程中运行,并且该进程可以有hundereds or thousands of threads。操作系统(Windows、Linux、Mac 等)将切换处理核心的执行上下文,以确保所有应用程序和服务都能分得一杯羹。

至于对诸如 RAM 之类的 I/O 访问,该访问由位于主板上的 NorthBridge Controller 物理控制。每个进程(不是处理器!)都会分配一定数量的 RAM,它可以处理它可以在应用程序的生命周期内扩展或收缩......这当然受限于资源数量在系统上可用,并且还值得注意的是,操作系统将负责交换 RAM 请求,超出其对磁盘的物理可用性(即虚拟 RAM)。 另一方面,尽管您需要通过使用critical sections 和其他线程同步机制来协调对应用程序中内存的访问。

OpenMP 是一个库,可帮助您编写多线程并行应用程序并使保持线程同步的语法更容易......我会评论更多,但自从我使用它已经有一段时间了,我确信有人可以给出更好的解释。

【讨论】:

感谢您的回复,@cheesus【参考方案3】:

我看到您使用的是 Windows,所以我将总结一下,您可以在任务管理器中设置进程关联(进程可以在哪些核心或多个核心上运行)。还有一个 winapi 调用,但这个名字让我忘记了

a) 对于单线程程序,它们不会在同一个 cpu 上启动(假设它的 cpu 绑定)。您可以通过更改亲和力来保证它。在linux中有一个调用sched_setaffinity和一个用户空间程序taskset

b) 依赖于 MPI 库;机器是特定于库的。

c) 它取决于特定的应用程序和数据模式。对于小数据访问但大量消息传递,您实际上可能会发现限制为 1 个 CPU 是最有效的模式。

【讨论】:

感谢@FooBah 的回复

以上是关于多核机器上的多个程序实例的主要内容,如果未能解决你的问题,请参考以下文章

网络分流器-网络分流器-多核编程的几个难题及其应对策略

对于大型多核机器上的数据密集型任务,多线程性能影响是啥? [关闭]

在单个多核机器上索引大型 dask 数据帧时的内存使用情况

在多核CPU下,同一进程下的多个线程可以并行运行吗

GO语言实现多核并行化运行实例

多核 CPU 和多个 CPU 有何区别