【问题标题】:Parallel with Microsoft R open (MKL), but no improvement与 Microsoft R open (MKL) 并行,但没有改进
【发布时间】: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


【解决方案1】:

在不了解代码的某些细节的情况下,这里有太多因素在起作用。例如,对每个进程有效的关联掩码是什么?并发进程中线程的 Tread Ideal Processor 是什么?您的进程可能正在尝试竞争相同的内核。您可以通过查看 SetThreadIdealProcessor 和 SetProcessAffinityMask API 找到更多详细信息。您的代码也可能使用受临界区或其他同步对象保护的共享资源。我首先从 Sysinternals 下载 Process Explorer 并查看每个进程的线程列表。这将告诉您有多少物理线程正在运行以及每个线程有多少上下文切换。这将为您提供一些开始。

【讨论】:

  • 感谢您的回复。你提到了很多我以前从未听说过的事情。我将尝试查看 Process Explorer 是否可以找到任何线索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多