Lin*_*len 9 parallel-processing r
我正在使用R转换一些shapefile.R使用我的处理器的一个核心来做到这一点,我想使用并行处理加速它.所以我将这个过程并行化了.
给出files哪个是要转换的文件列表:
library(doMC)
registerDoMC()
foreach(f=files) %dopar% {
# Code to do the conversion
}
Run Code Online (Sandbox Code Playgroud)
这很好用,它使用2个核心.根据该文件的registerDoMC(),默认情况下,该功能采用半被检测到的核parallel包.
我的问题是为什么我应该使用一半核心而不是所有核心?(在这种情况下,4个核心.)通过使用该功能,registerDoMC(detectCores())我可以使用我系统上的所有核心.如果有的话,这样做的缺点是什么?
除了可扩展性问题之外,还有一个简单的规则:至少在Windows下,英特尔超线程核心没有帮助.因此我使用detectCores()获得8,但是当超过4个核心时,我从未发现任何改进,即使MCMC并行线程通常也能完美扩展.
如果某人有一个案例(在Windows下),其中有超线程的改进,请发布.
你做并行处理的任何时候有一些开销(可以是平凡的,尤其是锁定的数据结构和阻塞调用).对于小批量作业,由于您没有支付这笔开销,因此在单核或两核上运行要快得多.
我不知道你的工作规模,但你应该进行一些缩放实验,你可以在1个处理器,2个处理器,4个处理器,8个处理器上完成工作,直到达到系统的最大核心数(通常,你总是加倍处理器数量).编辑:看起来你只使用4个核心,所以时间分别为1,2和4.
为每个核心计数运行约32次试验的计时结果并获得置信区间,然后您可以肯定地说,在所有核心上运行是否适合您.如果你的工作需要很长时间,减少试验次数,一直到5次左右,但请记住,更多的试验会让你更有信心.
详细说明:
学生的t检验基本上说"你计算了这个核心计数的平均时间,但这不是真正的平均值.如果我们得到无数个数据点的平均值,我们只能得到真正的平均值.实际计算的真实平均值位于计算平均值附近的某个区间"
然后,显着性的t检验基本上比较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值后,您可以通过查看临界值表来判断它们是否显着.现在,在您点击之前,您需要了解更多内容:
这与您拥有的数据点数有关.您拥有的数据点越多,平均值的间隔可能越小.自由度衡量你的计算平均值的移动能力,它是#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检验假设两种方法之间的差异和标准差是相同的.也就是说,它假设围绕真实均值的数据点的分布是相等的.如果你不想做出这个假设,那么你正在寻找韦尔奇的t检验,这个检验略有不同.维基页面有一个很好的公式来计算此测试的t值.
您希望避免一种情况:
在所有N个核心上传播任务
让每个核心使用OpenBLAS或MKL等所有核心来完成任务
因为现在你有一个N乘N的争用:N任务中的每一个都希望将其线性代数运用到所有N个核心.
在多用户环境中提供了另一个(平凡的)计数器示例,其中并非机器上的所有M个用户都可以(同时)转出到N个核心.