2011-08-08 43 views
4

我假设一个带有2个处理器的双核(每个处理器2个核心)机器用于解决后面的问题;所以共有4个“核心”。因此,一些天然的问题出现:多核机器上的多个程序实例

  1. 假设我写了一个简单的串行程序,并建立了它在,比方说,Visual Studio的..和运行相同程序的两倍,也就是说,在每次运行不同的输入数据。他们会在同一个处理器上运行吗?或独特的处理器?多少RAM内存将分配给每个?它是1处理器(2核心)上的RAM存储器还是总RAM?我相信这两个程序可以在不同的处理器上运行,并且每个应该都有一个处理器(2个内核)的RAM内存。但我不是100%确定的。 Linux上的行为会有什么不同吗?

  2. 现在假设我的程序是使用分布式内存并行接口,如MPI书面和我同在NP参数(说)2个处理器跑了一次。该程序是否会使用两个处理器(实际上是全部4个内核)?这是参数-np的最佳值吗?换句话说,如果我对-np 3或-np 4做了同样的处理,假设没有附加优势是正确的吗?再次,我认为是这样,但我不是100%确定的。我还假设我可以高于4(-np 5,-np 6等)。在这种情况下,这些过程如何在np> 4的值处竞争记忆? np> 4的性能会变差吗?我认为是的,也许这部分取决于问题的大小,但也不是100%确定的。

    接下来,假设我跑我的MPI内置并行程序的两个实例,都与-np 2,每一个,比如说,不同的输入数据。首先,这可能吗?我认为它是并且它们都在两个处理器上运行?这两个程序是如何同步的?他们如何逐一竞争内存?这应该至少部分地基于启动程序的顺序,据推测?

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

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

回答

5

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

核不会对正常的PC硬件自身的RAM,并且进程将给予他们要求的不过多的内存。

对于MPI进程,是的,你应该并行匹配核心数量(假设CPU-繁重的工作量)。如果两个MPI进程以-np 2运行,它们将只消耗全部四个内核。增加任何东西,他们会开始抗衡。正如上面所解释的那样,RAM与这些任何事情都没有关系,尽管缓存在竞争中会受到影响。

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

+0

@Cantos:谢谢你的回应;但你是否愿意详细阐述一下;这个问题有3类(串行,MPI和openMP),看起来像你刚刚回答的第一个问题。但再次感谢! –

+0

@Cantos:我刚才看到你编辑过。无论如何,我确实承认它是一个长期的问题。再次感谢。 –

+0

@ user545591:最好的答案将来自您自己的测试。 –

2

@Marcelo绝对是对的,我想稍微扩展一下他的回答。

操作系统将根据系统中正在进行的操作和可用资源确定线程组成应用程序执行的位置和时间。每个应用程序将运行在它自己的进程中,该进程可以有hundereds or thousands of threads。操作系统(Windows,Linux,Mac)将切换处理内核的执行上下文,以确保所有的应用程序和服务都可以分得一杯羹。

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

OpenMP是一个库,可以帮助您编写多线程应用程序,并使线程同步更容易的语法....我会评论更多,但它已经相当长的一段时间,因为我已经使用它,我是肯定有人可以给出更好的解释。

+0

感谢您的回复,@cheesus –

2

我发现你使用的是windows,所以我将总结说你可以在任务管理器中设置进程的亲和性(一个进程可以运行的核心或核心)。还有一个winapi调用,但名称逃脱我

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

b)依赖于MPI库;该机构是特定于图书馆的。

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

+0

感谢您的回复,@FooBah –

相关问题