Невозможно скомпилировать MEX-файл с _beginthreadex

Я пытаюсь ускорить некоторую обработку в программе 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 в качестве базового компилятора.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]