2010-08-23 40 views
4

我在办公室使用奔腾4 HT机器运行R,某些代码需要plyr软件包,我通常需要等待6-7分钟才能将脚本完成运行,而我看到我的处理器只有一半利用。在R中使用多核处理Pentium 4 HT机器

我听说过在R中使用Multicore软件包以更好地利用多核处理器,我的情况适合这种情况吗?

谢谢!

+0

你接受的解决办法,我很好奇:你打算怎么实现这一点? – Vince 2010-08-23 16:29:50

+0

我接受它,因为它清除了我的一些误解,我dun认为有什么我可以在这里实现,thx – lokheart 2010-08-24 03:58:23

回答

6

有一堆软件包可以做多色。见doMPI,doSNOW,doMCdoSMP。它们都是运行并行化的其他程序的前端(如MPI/OpenMPI,多核程序包......)。在Windows上,我对doSMP有很好的体验,而在Linux上,doMC看起来很有前途(有一些支持Windows的新兴技术,但有些人对模拟“fork”有疑问)。这就是说,我同意文斯的评论,关于需要编写plyr函数来使用并行计算的能力。你可以编写自己的函数来模拟plyr(或编辑plyr),该函数使用%dopar%(同样参见foreach包)。

两个“CPU使用历史”窗口可能表示两个内核或多线程。例如,我有一个带有4个内核的i7-920处理器,但我看到8个历史记录窗口,因为每个内核都是多线程的。

请原谅我的词汇和/或逻辑,但是当涉及到这些事情时,我会在Vince的文章中介绍那条鱼。

alt text

+0

Upvote了解硬件......但会让你成为鱼吗?我迷失在我自己的类比中:-) – Vince 2010-08-23 09:19:45

+0

谢谢,我认为我的是'多线程'的情况下,我的情况是多核心的东西,“没有去”,对吧? – lokheart 2010-08-23 09:26:00

+2

@lokheart no;英特尔的“超线程”仅仅是模拟两个核心(核心在第一个被阻塞的时候做第二个任务),所以基本上它只是多核(轻,但仍然)。多线程意味着您的程序在少量进程中运行,然后操作系统可以在多个内核之间进行并发运行。 – mbq 2010-08-23 09:39:14

1

这可能听起来像一个愚蠢的问题,但你的处理器有多个核心吗?这是我的理解P4的没有,但我对硬件的了解和鱼的天体物理一样多。

当你说你的“过程只是一半利用”,你的意思是你正在监测两个核心,只有一个正在使用,或者一个核心正在被半使用?如果是后者,你的应用程序可能是内存绑定的(可能会触及交换空间),而不是CPU,所以并行化将无济于事。

此外,它看起来并不像plyr软件包使用multicore软件包,因此您必须明确重写部分plyr以实现并行化。但是,如果plyr的某些部分是平行的,我敢打赌他们已经被并行化了。

所以我不认为你的问题是CPU绑定,我认为这是内存限制(和交换)。监视你的记忆,也许把它移到更高的记忆机器上。

希望这会有所帮助!

编辑:

@Vince正如我在romunov的答案写; HT核心将执行2个进程 比一个核心更快(但速度比2 核心更快),所以它是值得 并行。内存绑定 进程也将占用100%的内核。 (我的重点)

值得做的并行?这个等式还有很多。无数次探索Python的多处理和线程模块我已经重写了整个程序 - 甚至是“易于并行化”的程序 - 而且运行速度更慢。为什么?开放新线程,进程,将数据转移到不同进程等方面存在固定成本。这不是那么简单;按照我的经验,并行化有从来没有是它在这里被讨论的魔力子弹。我认为这些答案是误导性的。

首先,我们讨论的是平行化需要“6-7分钟”的任务。除非OP知道他/她的数据会增长很多,否则并行化甚至不值得编程所需的挂钟时间。在实现并行版本所需的时间内,他或她可能已经完成了100次非平行运行。在我的工作环境中,挂钟时间很重要。这些计算需要考虑到运行时方程式(除非你是为了学习/乐趣而做的)

其次,如果它正在交换空间,最大的减速不是CPU,它是磁盘I/O.即使有一种简单的方法来混合plyr代码以获得并行化的某些部分(我怀疑它),但在I/O绑定的过程中这样做会比添加更多内存的速度快得多。

作为一个例子,我曾经从重塑包中运行一个命令来演示这种确切的行为。它是在一台带有4GB内存的多核OS X机器上,几秒钟内它就抓取了(整个计算机正在爬行!),两个内核之间的CPU占用率为60-70%,并且使用了所有4GB的内存。我让它作为一个小时的实验运行,然后杀死R,并看到我的记忆跳回到3GB免费。我把它换成了512GB的RAM服务器(是的,我们很幸运能够拥有它),并在7分钟内完成。核心使用量没有变化。

+0

我用winxp的任务管理器来监视CPU进程,我可以看到两个图表记录CPU进程,所以我想这意味着它有两个核心。也许我真的在问愚蠢的问题。再次感谢。 – lokheart 2010-08-23 08:27:29

+0

多核应该看起来像这样:http://www.ixbt.com/cpu/images/intel-pentium-xe-955/taskman.gif – Vince 2010-08-23 08:34:22

+0

我有2个窗口的“CPU使用历史”,但曲线不是和你一样极端,一个在上面,三个在下面,我的两个都差不多在中间。 – lokheart 2010-08-23 08:59:37