Многопоточность с Matlab

Я работаю над проектом на Matlab, где мы должны оптимизировать производительность, и я думал о распараллеливании нескольких вызовов функций, которые были сделаны из a .m-файл.

идея была простой, из файла Matlab (.m) вызовите файл C, скомпилированный как MEX, и из этого файла C создайте пару потоков и вызовите функции matlab из каждого потока.

теория работает, я могу создать потоки, и я также могу вызвать функцию matlab, проблема что я не могу вызвать функцию matlab из потока:

//Global variables
mxArray **g_plhs;
mxArray **g_prhs;
int g_nlhs;
int g_nrhs;

//Thread function
DWORD WINAPI my_function( LPVOID lpParam ) 
{
    mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,"matlab_function");
    return 0; 
}


//Main function
void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[]) {

    DWORD dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 
    g_plhs = plhs;
    g_prhs = prhs;
    g_nlhs = nlhs;
    g_nrhs = nrhs;

    hThreadArray[0] = CreateThread( 
        NULL,                   
        0,                      
        my_function,            
        NULL,                   
        0,                      
        &dwThreadIdArray[0]);   

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

    for(i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
    }
}

есть ли у нас какие-либо ограничения на эту опцию при работе с matlab? Кто-то что-то пробовал такой?

Edit: есть ли опция, которая не требует параллельного набора инструментов?

4 ответов


вы можете вызывать функции mx* и mex* только из основного потока MATLAB. Вы можете писать многопоточные файлы MEX, если они выполняют свою работу на уровне ниже интерфейса mx. Если вы хотите несколько интерпретаторов MATLAB, вам нужно несколько процессов MATLAB. Один из способов - через Parallel Computing Toolbox, как указано @You. Это дает вам PARFOR петли и SPMD блоки для одновременного запуска вещей.


вам, вероятно, будет лучше использовать встроенные функции многопоточности MATLABs, такие как parfor. На самом деле, многие функции MATLAB уже многопоточны (включая матричные операции), поэтому вам не нужно распараллеливать вещи самостоятельно, кроме замены for С parfor. (В общем, while петли не могут быть паралеллизированы.)


лучше parfor. если вы студент, вы можете получить parallel toolbox довольно дешево. даже полная цена не так много, если вы серьезно относитесь к производительности. Ваш код выше будет подвержен ошибкам и трудно тестироваться. используя parfor интуитивно понятен и чист.


Я удивлен, что все настаивают на parfor. Я бы рекомендовал вам, по крайней мере, подумать, можете ли вы разработать свой алгоритм для вызова из Matlab и запустить критические разделы низкого уровня из многопоточного C/C++ без вызова mex. В целом это должно быть возможно. Особенно, если вы используете Matlab profiler или аналогичный инструмент, чтобы выяснить, какие шаги вашего анализа являются узким местом, тогда вы можете написать только 1 или 2 шага в многопоточном С.

другим способом было бы написать свой параллелизм на Java, с которым легче работать из Matlab.

другие параметры, которые вы можете проверить, включают multicore представление на Matlab Central или MatlabMPI библиотека. Оба немного kludgy и предназначены для межпроцессного параллелизма (вам нужно запустить несколько экземпляров Matlab), поэтому не подходит для очень мелкозернистого, сложного параллелизма. Но для просто ломать работа в 4 или 8 или 16 частей, они должны получить работу, и не менее multicore имеет разумную поддержку сообщества. Я не пробовал!--3--> еще, но выглядит многообещающе. В качестве бонуса они должны работать на нескольких машинах, хотя им, вероятно, потребуется общая сетевая файловая система.