我在一段并行代码中使用多个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。
答案 0 :(得分:1)
如您的问题下方所述,如果您不同步地从多个线程中故意调用non-thread safe closed source library的函数,则该行为是不可预测的,因此应避免这样做。可能的想法是将对MATLAB引擎的调用跨多个进程,但是请考虑这可能会增加复杂性(需要进程间同步)并降低性能。
顺便说一句,C ++ 11和更高版本的用户应该使用新的MATLAB Engine API for C++进行编程。请注意,engOpenSingleUse
在新API中没有(至少不是显式)等效功能(最近的替代物为matlab::engine::startMATLAB
)。