Почему OpenMP в mex-файле создает только 1 поток?

#matlab #parallel-processing #openmp #mex

#matlab #параллельная обработка #openmp #mex

Вопрос:

Я новичок в OpenMP. У меня есть следующий код, который отлично компилируется с использованием Matlab mex, настроенного с MSVS2010. На компьютере доступно 8 процессоров (что я также проверил с помощью matlabpool).

 #include "mex.h"
#include <omp.h>

typedef unsigned char uchar;
typedef unsigned int uint;
//Takes a uint8 input array and uint32 index array and preallocated uint8 array the same
//size as the first one and copies the data over using the indexed mapping
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[] ) 
{
    uint N = mxGetN(prhs[0]);
    mexPrintf("n=%in", N); mexEvalString("drawnow");
    uchar *input = (uchar*)mxGetData(prhs[0]);
    uint *index = (uint*)mxGetData(prhs[1]);
    uchar *output = (uchar*)mxGetData(prhs[2]);

    uint nThreads, tid;
#pragma omp parallel private(tid) shared(input, index, output, N, nThreads) num_threads(8) 
    {
        tid = omp_get_thread_num();

        if (tid==0) {
            nThreads = omp_get_num_threads();

        }

        for (int i=tid*N/nThreads;i<tid*N/nThreads N/nThreads;i  ){
            output[i]=input[index[i]];
        }
    }
    mexPrintf("nThreads = %in",nThreads);mexEvalString("drawnow");
}
  

Результат, который я получаю, это

 n=600000000
nThreads = 1
  

Почему создается только один поток, несмотря на то, что я запрашиваю 8?

Ответ №1:

Вздох. Как правило, тратите часы на попытки и неудачи, а затем находите ответ через 5 минут после публикации в SO.

Файл должен быть обработан с поддержкой openmp

 mex mexIndexedCopy.cpp COMPFLAGS="/openmp $COMPFLAGS"
  

Комментарии:

1. Я знаю это чувство, брат.

2. какой эквивалентный вариант под Linux с gcc в качестве компилятора? -fopenmp ?

3. @linello Да. На самом деле я просто потратил пару часов впустую, потому что неправильно сдавал -fopenmp . Вам нужно передать его как компилятору, так и компоновщику. mex CXXFLAGS="$CXXFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" [other options] <file.cpp> для C . (Для C используйте CFLAGS вместо CXXFLAGS ; как для C, так и для C используйте оба.)

4. Действительно @SchighSchagh. На компьютере с Linux я должен был убедиться, что -fopenmp был на каждом этапе компиляции, поэтому у меня сработало то, что mex CFLAGS='$CFLAGS -fopenmp' LDFLAGS='$LDFLAGS -fopenmp' COPTIMFLAGS='$COPTIMFLAGS -fopenmp -O2' LDOPTIMFLAGS='$LDOPTIMFLAGS -fopenmp -O2' DEFINES='$DEFINES -fopenmp' -v functionName.F где DEFINES используется только для того, чтобы убедиться, что -fopenmp дошло до первой строки компиляции.