And*_*edd 8 parallel-processing ubuntu r
我使用parallel和doParallel包运行ubuntu 12.04和R 2.15.1.当我并行运行任何东西时,我限制在100%的核心,当我应该有高达800%,因为我运行8核心.系统监视器上显示的是每个子进程只获得12%.
是怎么回事限制了我的执行速度?
cbe*_*ica 10
问题可能是R进程仅限于一个核心(并且子进程继承了该进程).
试试这个:
> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
pid 3064's current affinity mask: fff
pid 3064's new affinity mask: fff
Run Code Online (Sandbox Code Playgroud)
现在,如果在您的机器上,当前关联掩码报告1,那么这就是问题所在.上面的行应解决它(即第二行应报告fff(或类似).
Simon Urbanek编写了一个mcaffinity允许对多核进行控制的函数.据我所知,它仍然在R-devel.
有关详细信息,请参阅例如关于R-sig-hpc的讨论.
更新,除了新国的回答:
如果您通过openblas和显式并行化(通过parallel/snow/multicore)一起使用隐式并行化,则可能需要更改openblas使用的线程数,具体取决于您是否位于显式并行部分内.
这是可能的(在Linux下使用openblas,我不知道任何其他通常优化的BLAS'提供线程数的函数),有关详细信息,请参阅Simon Fuller的博客文章.
由于libblas.so(.3gf)包装我遇到了同样的问题,我不知道这是否也会导致你的问题.当R启动时,它调用BLAS系统中安装的系统进行线性代数计算.我有libopenblas.so(.3gf)并且它通过选项"CPU Affinity"进行了高度优化,也就是说,当你进行数值向量或矩阵计算时,openblas包只会生成8个线程,并使每个线程都粘在一个指定和固定的线程上CPU加速代码.但是,通过设置此项,系统会告知您所有CPU都非常繁忙,因此如果进一步执行并行任务,系统会尝试将它们挤入一个CPU,以便尽量不干扰繁忙的CPU.
所以这是我的解决方案有效:我下载了一个openblas软件包源并编译了文件" Makefile.rule"已更改:有一行" #NO_AFFINITY = 1"我刚刚删除了" #",因此在编译后,没有选择任何关联选项.然后我安装了包,问题解决了.
有关此内容的参考,请参阅https://github.com/ipython/ipython/issues/840
请注意,这是一个权衡.删除CPU亲和力会让你在进行数值计算时失去一些效率,这就是为什么虽然openblas维护者(张先生博士)知道这个问题,但他仍然以cpu affinity作为默认选项发布代码.