Я пытаюсь ускорить некоторую обработку в программе Matlab через распараллеливание. У меня нет доступа к Parallel Computing Toolbox, поэтому я пытался сделать это через mex-файлы. (Возможно) соответствующие части того, что у меня есть:
#include "mex.h"#include "math.h"#include <windows.h>
#include <process.h>
#define voidthread unsigned __stdcall
#define ThreadHANDLE HANDLE
...voidthread computeloop (double **Args) {
...
}
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
...
/* double pointer array to store all needed function variables) */
double ***ThreadArgs, **ThreadArgs1;
/* Handles to the worker threads */
ThreadHANDLE *ThreadList;
...
/* Reserve room for handles of threads in ThreadList */
ThreadList = (ThreadHANDLE*)malloc(Nthreads* sizeof( ThreadHANDLE ));
ThreadID = (double **)malloc( Nthreads* sizeof(double *) );
ThreadArgs = (double ***)malloc( Nthreads* sizeof(double **) );/* Assign pointer to output. */
O_grad =(double *)mxGetData(plhs[0]);
...
for (i=0; i<Nthreads; i++) {
/* Make Thread ID */
ThreadID1= (double *)malloc( 1* sizeof(double) );
ThreadID1[0]=(double)i;
ThreadID[i]=ThreadID1;
O_gradThread[i]=mxCreateNumericArray(3, Osize, mxDOUBLE_CLASS, mxREAL);
/* Make Thread Structure */
ThreadArgs1 = (double **)malloc( 10* sizeof( double * ) );
ThreadArgs1[0]=O_grid_size;
ThreadArgs1[1]=Nthreadsd;
ThreadArgs1[2]=d_p;
ThreadArgs1[3]=dxa;
ThreadArgs1[4]=dya;
ThreadArgs1[5]=dza;
ThreadArgs1[6]=d_p_size;
ThreadArgs1[7]=O_grid_index;
ThreadArgs1[8]=ThreadID[i];
ThreadArgs1[9]=(double *)mxGetData(O_gradThread[i]);
ThreadArgs[i]=ThreadArgs1;
ThreadList[i]=(HANDLE)_beginthreadex(NULL, 0, &computeloop, ThreadArgs[i], 0, NULL);
}
...
}
Тем не менее, когда я пытаюсь скомпилировать его, я получаю сообщение об ошибке
error C2664: '_beginthreadex' : cannot convert parameter 3 from 'unsigned int (__cdecl *)(double **)' to 'unsigned int (__cdecl *)(void *)'
ссылаясь на строку ThreadList[i]=(HANDLE)_beginthreadex(NULL, 0, &computeloop, ThreadArgs[i], 0, NULL);
в mexFunction.
Когда я пытался изменить computeloop
взять void *
аргумент вместо double **
(аналогично решению для этот вопрос) и приведя аргументы в него, я просто оказался с еще большим количеством ошибок. Кроме того, этот общий шаблон работает с парой файлов, которые я видел на Matlab File Exchange. Это тот случай, когда в другом месте произошла ошибка, которая не была обнаружена компилятором до этого момента, или я что-то упустил? Я компилирую его через Matlab, используя Microsoft Visual Studio 2010 Professional в качестве базового компилятора.
Задача ещё не решена.
Других решений пока нет …