在R中进行并行处理时,我应该使用每个核心吗?

时间:2013-08-17 16:08:11

标签: r parallel-processing

我正在使用R转换一些shapefile。 R使用我的处理器的一个核心来做到这一点,我想使用并行处理加速它。所以我把这个过程并行化了。

给定files这是要转换的文件列表:

library(doMC)
registerDoMC()

foreach(f=files) %dopar% {
  # Code to do the conversion
}

这很好用,它使用2个核心。根据{{​​1}}的{​​{3}},默认情况下,该函数使用registerDoMC()包检测到的一半核心。

我的问题是为什么我应该使用一半内核而不是所有内核? (在这种情况下,4个核心。)通过使用函数parallel,我可以使用我系统上的所有核心。如果有的话,这样做的缺点是什么?

5 个答案:

答案 0 :(得分:9)

除了可扩展性问题之外,还有一个简单的规则:至少在Windows下,英特尔超线程核心没有帮助。因此我使用detectCores()得到8,但是当超过4个内核时,我从未发现有任何改进,即使MCMC并行线程通常也能完美扩展。

如果某人有一个案例(在Windows下),其中有超线程的改进,请发布。

答案 1 :(得分:6)

任何时候进行并行处理都会产生一些开销(这可能非常重要,特别是对于锁定数据结构和阻塞调用)。对于小批量作业,由于您没有支付这笔费用,因此在单核或两核上运行要快得多。

我不知道你的工作规模,但你应该进行一些缩放实验,你可以在1个处理器,2个处理器,4个处理器,8个处理器上完成工作,直到达到系统的最大核心数。 (通常,您总是将处理器数量增加一倍)。 编辑:看起来你只使用4个核心,所以时间分别为1,2和4。

为每个核心计数运行约32次试验的计时结果并获得置信区间,然后您可以肯定地说,在所有核心上运行是否适合您。如果你的工作需要很长时间,减少试验次数,一直到5次左右,但请记住,更多的试验会让你更有信心。

详细说明:

Student's t-test

学生的t检验基本上说“你计算了这个核心计数的平均时间,但这不是真正的平均值。如果我们有无穷多个数据点的平均值,我们只能得到真正的平均值。真正的平均值实际上位于计算平均值附近的某个区间“

显着性的t检验基本上比较了2个数据点的真实平均值周围的间隔,并说明它们是否显着不同。所以你可能有一个平均时间少于另一个,但由于标准偏差足够高,我们不能肯定地说它实际上更少;真正的平均值可能相同。

因此,计算此测试的重要性:

  • 运行计时实验
  • 每个核心数:
  • 计算您的均值和标准差。标准差应为总体标准差,即总体方差的平方根 Population variance是(1 / N)* summation_for_all_data_points((datapoint_i - mean)^ 2)

现在,您将获得每个核心数的平均值和标准差:(m_1,s_1),(m_2,s_2)等。   - 对于每对核心数量:   - 计算t值:t =(mean_1 - mean_2)/(s_1 / sqrt(#dataPoints))

我展示的示例t值测试核心计数为1的平均计时结果是否与核心计数为2的计时结果显着不同。您可以通过以下方式测试相反:

t =(m_2 - m_1)/(s_2 / sqrt(#dataPoints))

计算完这些t值后,您可以通过查看critical value table来判断它们是否显着。现在,在您点击之前,您需要了解更多内容:

自由度

这与您拥有的数据点数有关。您拥有的数据点越多,平均值的间隔可能越小。自由度衡量你的计算平均值的移动能力,它是#dataPoints - 1(我提供的链接中的 v )。

α

Alpha是概率阈值。在高斯(正常,钟形弯曲)分布中,alpha在左侧和右侧切割钟形曲线。截止中间的任何概率都落在阈值内并且是无关紧要的结果。较低的alpha值会使得获得显着结果变得更加困难。即alpha = 0.01表示只有前1%的概率是显着的,alpha = 0.05表示前5%。大多数人使用alpha = 0.05。

在我链接到的表格中,1-alpha确定您将要查找关键值的列。 (所以alpha = 0.05给出0.95,或95%置信区间), v 是你的自由度或行要看。

如果您的临界值 <计算 t (绝对值),则结果不重要。如果临界值大于您的计算 t (绝对值),则您具有统计显着性。

编辑:学生的t检验假设两种方法之间的方差和标准差是相同的。也就是说,它假设真实均值周围的数据点的分布是相等的。如果您不想做出这个假设,那么您正在寻找Welch's t-test,这略有不同。维基页面有一个很好的公式来计算这个测试的t值。

答案 2 :(得分:5)

您希望避免一种情况:

  • 在所有N个核心上传播任务

  • 让每个核心使用OpenBLAS或MKL等所有核心来完成任务

因为现在你有一个N乘N的争用:每个N任务都希望将其线性代数运用到所有N个核心。

在多用户环境中提供了另一个(平凡的)计数器示例,其中并非计算机上的所有M用户都可以(同时)将其扩展到N个核心。

答案 3 :(得分:3)

不使用所有可用内核的另一个原因是,如果您的任务使用大量内存而您没有足够的内存来支持该数量的工作者。请注意,确定给定内存量可以支持多少工作人员可能很棘手,因为doMC使用mclapply分配工作者,因此除非修改了工作符,否则可以在工作程序之间共享内存其中一个。

从这个问题的答案中可以清楚地看出,找出合适数量的工人并不总是很容易。有人可能会争辩说不应该是默认值,并且应该强迫用户指定数字,但我不确定我是否会走得那么远。无论如何,使用一半核心数并没有什么神奇之处。

答案 4 :(得分:2)

嗯。我不是一个并行处理专家,但我一直认为使用所有内核的缺点是当你尝试其他任何东西时它会使你的机器变得迟钝。当我使用所有内核时,我个人已经遇到过这种情况,所以我现在的做法是在我做一些并行的时候使用我的8个内核中的7个,留下一个核心来做其他事情。