【发布时间】:2016-09-12 17:32:25
【问题描述】:
我正在运行 MCMC 算法,并且在 Windows 7 上打开的 Microsoft R 大大提高了我的速度。但现在我需要使用我的算法运行大量模拟,所以我使用 R snow 包来并行我的代码。但是,它不起作用。
具体来说,我PC上打开的Microsfot R是用4核计算的,一共8核。所以我想我将在我的 PC 上并行 2 个进程,因为每个进程都需要 4 个内核用于 MKL 库。但平行线根本不是真实的。我在并行时设置了所有 8 个内核。我的测试程序需要 5 分钟才能运行。但是,如果我将我的程序与它的副本并行,我希望 2 过程也需要 5 分钟。但实际上花了10分钟,就像顺序运行2个进程一样。
如果我尝试打开两个 R 会话并运行两个 R 会话中的程序,也会发生同样的事情。通常只需要 5 分钟,但现在每个需要 10 分钟。
那么我在哪里搞砸了?那是关于两层并行的问题吗?一个是我的级别,一个是intel MKL级别的?
【问题讨论】:
-
不要被物理和逻辑核心混淆。通过
library(parallel);detectCores()计算的逻辑包括超线程。但 Microsoft R Open 在启动时报告的是物理内核。例如,MRO 在我的机器上说Multithreaded BLAS/LAPACK libraries detected. Using 2 cores for math algorithms.。但是detectCores()正在报告4。 -
@cryo111 所以我认为我的 PC 上有 4 个物理内核。我只是尝试使用 setMKLthreads(1) 将其限制为 1 个物理内核,但仍然无济于事。实际上,setMKLthreads(1) 只比 setMKLthreads(4) 慢 1 分钟,这在我的情况下是可以的。如果当我使用所有 4 个核心进行并行处理时 1 个核心 MKL 可以正常工作,我也可以完成我的工作。但它与上述相同的结果不起作用。
-
如果您提供一些带有可重现示例的代码会更容易。您可以使用
Sys.sleep(20)左右来代替耗时的计算... -
很遗憾,我无法用一些测试代码重现问题。并行工作非常适合测试代码......我使用的一些 C++ 代码会有问题吗?我使用 Rcpp 编写了一个 R 包并编译它(编译时为 4 核)并将包加载到每个集群。
-
编写一个Rcpp包并上传到每个集群节点是正确的做法。我假设您没有在 C++ 代码中使用 C++ 线程库,对吧?否则,这可能会干扰 R。我会在你的包中添加一个简单的 C++ 函数,然后看看它是否有效。然后从这个简单的函数开始,我将逐步完成您真正想要实现的完整 C++ 例程。在这条路上的某个地方,可能会出现问题。
标签: r parallel-processing intel-mkl