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

Multiple instances of program on multi-core machine

本文关键字:实例 多核 机器 程序      更新时间:2023-10-16

我假设一个双核(每个处理器2核)的机器有2个处理器,用于以下问题;总共有4个"核心"。于是,一些自然的问题出现了:

  1. 假设我写了一个简单的串行程序,并将其内置在Visual Studio中。将同一个程序运行两次,每次运行时输入的数据不同。它们会在同一个处理器上运行吗?或者不同的处理器?每个分配多少RAM内存?它是1个处理器(2核)上的RAM内存还是总RAM?我认为这两个程序将在不同的处理器上运行,并且每个程序都应该有1个处理器(2核)的RAM内存;但我不能百分之百确定。在Linux上这种行为会有什么不同吗?

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

    接下来,假设我运行我的mpi构建的并行程序的两个实例,都使用-np 2,每个实例都使用不同的输入数据。首先,这可能吗?我假设是这样,并且它们都在两个处理器上运行?这两个程序是如何同步的,它们又是如何依次争夺内存的?这应该至少在一定程度上取决于启动程序的顺序,对吧?

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

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

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

Çores在正常的PC硬件上没有自己的RAM,进程将被分配多少RAM。

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

这个"问题"太长了,所以我要停止了。

@Marcelo绝对是正确的,我想就他的回答进行一点扩展。

操作系统将根据系统中发生的其他事情和可用资源决定线程在何时何地组成应用程序执行。每个应用程序将在自己的进程中运行,该进程可以有数百或数千个线程。操作系统(Windows, Linux, Mac等)将切换处理核心的执行上下文,以确保所有应用程序和服务都能分到一块蛋糕。

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

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

我看到您使用的是windows,所以我总结一下,您可以在任务管理器中设置进程亲缘关系(进程可以在哪个内核或哪个内核上运行)。还有一个winapi调用,但是名字转义为

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

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

c)这取决于具体的应用程序和数据模式。对于小数据访问和大量消息传递,您可能会发现将CPU限制在1个是最有效的模式。