【问题标题】:Matlab engines within parallel loop并行循环内的 Matlab 引擎
【发布时间】:2014-09-15 10:16:15
【问题描述】:

我在一段并行代码中使用多个 matlab 引擎时遇到了一些问题。我可以使用engOpenSingleUse 成功生成多个引擎,但无法与多个引擎进行通信(即调用engPutVariable 失败)。

和往常一样,一个最小(VS)示例:

#include "stdafx.h"
#include <engine.h>
#include <omp.h>

int _tmain(int argc, _TCHAR* argv[])
{
//First spawn the matlab engine sessions
Engine *m_Engines[2];
for (int i = 0; i < 2; i++)
{
    m_Engines[i] = engOpenSingleUse(NULL, NULL, NULL);
}

//Then spawn the worker threads...
#pragma omp parallel num_threads(2)
{   
    // Allocate an engine to each thread
    int thread_num = omp_get_thread_num();
    Engine *thisEngine = m_Engines[thread_num];

    #pragma omp for
    for (int i = 0; i < 10000; i++)
    {
        // Create an mxArray and stick some data in it
        mxArray* mM = NULL;
        mM = mxCreateDoubleMatrix(1, 1, mxREAL);
        double data[1] = { 1.0 };
        memcpy((void *)mxGetPr(mM), (void *)data, sizeof(data));

        // Send it across to matlab
        engPutVariable(thisEngine, "A", mM);
        // Run some algorithm
        engEvalString(thisEngine, "A=A+1;");
        // Retrieve result
        mM = engGetVariable(thisEngine, "A");

        // Get it out of the mxarray
        double A = *mxGetPr(mM);
    }
}

return 0;
}

有什么想法吗?我在 Win x64 上使用 Matlab R2012b。

【问题讨论】:

  • 尝试在并行区域内移动engOpenSingleUse 调用。另请注意,MATLAB 引擎函数不是线程安全的,调用它们时需要小心(阅读:同步)。

标签: c++ matlab openmp matlab-engine


【解决方案1】:

正如您在问题下方评论的那样,如果您故意从多个线程调用 non-thread safe closed source library 的函数而没有同步,那么行为是不可预测的,您应该避免这样做。一个可能的想法是跨多个进程调用 MATLAB 引擎,但请注意这可能会增加复杂性(需要进程间同步)并降低性能。

顺便说一句,C++11 和更高版本的用户应该使用新的MATLAB Engine API for C++ 进行编程。请注意,engOpenSingleUse 在新 API 中没有等效功能,至少没有明确说明(最接近的替换是matlab::engine::startMATLAB)。

【讨论】:

  • "如果你故意从多个线程中调用非线程安全的闭源库的函数而没有同步,那么行为是不可预测的"你可以从那句话中删除"闭源",仍然是正确的。我不确定为什么需要在此处指定。
  • @Chris 你是对的,当然。我想强调的是,即使没有访问源代码,你也无法预测会发生什么(即你实际上是在玩一个黑盒子)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多