我假设一个双核(每处理器2个核心)机器,带有2个处理器,用于解决后面的问题;所以共有4个“核心”。所以出现了一些自然的问题:
假设我编写了一个简单的串行程序并将其构建在Visual Studio中,并在每次运行中运行相同的程序两次,例如,使用不同的输入数据。他们会在同一个处理器上运行吗?或不同的处理器?每个RAM内存分配多少?它是1个处理器(2个内核)的RAM内存还是总RAM?我相信这两个程序可以在不同的处理器上运行,每个程序都应该有1个处理器的RAM内存(2个内核);但我并非100%肯定。 Linux上的行为会有什么不同吗?
现在假设我的程序是使用分布式内存并行接口(如MPI)编写的,我在np参数中使用2个处理器运行一次(比方说)。该程序是否会使用两个处理器(实际上是所有4个内核)?这是参数-np的最佳值吗?换句话说,如果我用-np 3或-np 4做同样的事情;假设没有额外的优势是正确的吗?我想是的,但我并非百分之百确定。我还假设我可以高于4(-np 5,-np 6等)。在这种情况下,进程如何以np> 1的值竞争存储器。 4?对于np>,性能会变差吗?我认为是的,也许这部分取决于问题的大小,但也不是100%肯定。
接下来,假设我运行了两个MPI构建的并行程序实例,两个都带有-np 2,每个实例都有不同的输入数据。首先,这可能吗?我假设它们都在两个处理器上运行?这两个程序是如何同步的,它们如何逐个地单独竞争内存?这应该至少部分地基于启动程序的顺序,大概是吗?
最后,假设我的程序是使用共享内存并行接口(如OpenMP)编写的,并且我运行了一次。我可以运行多少“线程”来充分利用共享内存并行性 - 是2还是4? (因为我有2个处理器,每个处理器有2个核心)。我的猜测是4;因为所有4个内核都是单个共享内存单元的一部分?那是对的吗?如果答案是4;在超过4个线程上运行是否有意义?我不确定这是否有效(与MPI不同,我相信我们可以做到-np 5,-np 6等等。)
最后,假设我运行共享内存并行程序的2个实例,每个实例都有不同的输入数据。我认为这是可能的,并且各个进程会以某种方式竞争内存,可能是程序启动的顺序?
答案 0 :(得分:7)
他们运行的处理器完全取决于操作系统,取决于许多因素,包括同一台计算机上发生的其他任何因素。但是,常见的情况是,它们往往会分别坐在一个核心上,偶尔会交换到不同的核心(“偶尔”可能意味着每秒几次甚至更频繁)。
在普通的PC硬件上没有自己的RAM,并且无论他们要求多少内存,都会给出这些过程。
对于MPI进程,是的,您的并行性应该与核心数相匹配(假设CPU负载很大)。如果两个MPI进程使用-np 2运行,它们将只消耗所有四个核心。增加任何东西,他们将开始抗衡。如上所述,RAM与其中的任何一个都无关,尽管在存在争用时缓存会受到影响。
这个“问题”太长了,所以我现在要停下来了。
答案 1 :(得分:3)
操作系统将根据系统中的其他内容和可用资源确定构成应用程序执行的线程的位置和时间。每个应用程序都将在其自己的进程中运行,该进程可以具有hundereds or thousands of threads。操作系统(Windows,Linux,Mac等)将切换处理内核的执行上下文,以确保所有应用程序和服务都能获得一块蛋糕。
对于由主板上的NorthBridge Controller物理控制的RAM等I / O访问。每个进程(不是处理器!)将具有可以处理的分配量的RAM,可以在应用程序的生命周期内扩展或收缩...这当然仅限于资源量在系统上可用,并且值得注意的是操作系统将负责交换RAM请求,超出它对磁盘的物理可用性(即虚拟RAM)。 另一方面,您需要通过使用critical sections和其他线程同步机制来协调对应用程序内存的访问。
OpenMP是一个库,可以帮助你编写多线程的parellel应用程序,并使保持线程同步的语法更容易....我会评论更多,但它已经有一段时间,因为我已经使用它,我敢肯定有人可以给出更好的解释。
答案 2 :(得分:2)
我看到你正在使用Windows,所以我将总结说你可以在任务管理器中设置进程关联性(进程可以运行的核心或核心)。还有一个winapi电话,但名字逃脱了我
a)对于单线程程序,它们不会在同一个cpu上启动(假设它的cpu绑定)。您可以通过更改亲和力来保证它。在linux中有一个调用sched_setaffinity
和一个用户空间程序taskset
b)取决于MPI库;机器是特定于图书馆的。
c)它取决于具体的应用和数据模式。对于小数据访问但传递大量消息传递,您实际上可能会发现限制为1 CPU是最有效的模式。