Многопоточность с Matlab - PullRequest
6 голосов
/ 20 июля 2011

Я работаю над проектом на Matlab, где мы должны оптимизировать производительность, и я думал о распараллеливании пары вызовов функций, которые были сделаны из файла .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? Кто-нибудь пробовал что-то подобное?

Редактировать: Есть ли опция, которая не требует Parallel Toolbox?

Ответы [ 4 ]

6 голосов
/ 20 июля 2011

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

3 голосов
/ 20 июля 2011

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

1 голос
/ 26 августа 2011

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

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

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

1 голос
/ 20 июля 2011

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

...