具有多个核心的GotoBLAS2

时间:2013-11-23 23:20:21

标签: r parallel-processing blas

我试图在Unix上的R 3.0上使用GotoBLAS2。我从TACC网站下载了GotoBLAS2源代码,编译了它,并按照链接http://www.rochester.edu/college/gradstudents/jolmsted/files/computing/BLAS.pdf的说明用libgoto2.so替换了libRblas.so。 R中的简单矩阵运算就像“行列式”一样快了20倍(我使用的是巨大的矩阵),这很好。但是,我现在不能并行使用多个内核。

例如,下面的代码永远运行。但如果我用“for”而不是“foreach”来评论,那只需要一秒钟。当我使用R的默认BLAS库时,我可以运行下面的代码(使用许多内核)(但是由于BLAS没有经过优化,所以需要更多的时间)..

library("foreach")
library("doParallel")

registerDoParallel(cores=2)
set.seed(100)

foreach (i = 1:2) %dopar% {
# for (i in 1:2) {
a = replicate(1000, rnorm(1000))
d = determinant(a)

那么,是否可以与GotoBLAS2同时使用多个核心,您有什么想法吗?

提前多多感谢。

2 个答案:

答案 0 :(得分:1)

最有可能的是,GotoBLAS已经在使用多个核心,因此使用%dopar%没有任何好处。我还希望从%dopar%开始减速,因为您运行的线程数多于您拥有的CPU核心数。

仍然不希望代码“永远运行”,只比for慢。

答案 1 :(得分:1)

如果并行任务将执行多线程操作,则应确保doParallel worker的数量乘以BLAS库使用的线程数不大于核心数。但是你可能会遇到由GotoBLAS2引起的另一个问题。

GotoBLAS2和OpenBLAS的默认构建设置R进程的CPU亲和性,使子进程全部在CPU的同一核心上运行。这会导致诸如parallel / doParallel之类的包出现严重问题,因为所有工作人员都被迫使用单个核心。

您可以使用新的“mcaffinity”函数解决此问题,该函数已添加到R 3.0.0中的并行程序包中,专门用于解决此问题。您也可以使用它来验证这是您的问题。以下是R会话的输出,最初限制为在单个核心上运行:

> library(parallel)
> mcaffinity()
[1] 1
> mcaffinity(1:128)
[1] 1 2 3 4 5 6

执行此操作后,可以使用所有六个核心。对于您的示例,只需在执行foreach循环之前添加mcaffinity(1:128)

但是既然您从源代码构建了GotoBLAS2,您也可以通过在Makefile中将NO_AFFINITY设置为“1”并重建来禁用此功能:

# If you want to disable CPU/Memory affinity on Linux.
NO_AFFINITY = 1