2011-11-07 6 views
8

Sono nuovo di OpenMP. Ho il seguente codice che compila bene usando Matlab mex configurato con MSVS2010. Il computer ha 8 processori disponibili (che ho controllato anche usando matlabpool).Perché OpenMP in un file mex produce solo 1 thread?

#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=%i\n", 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 = %i\n",nThreads);mexEvalString("drawnow"); 
} 

L'output che ottengo è

n=600000000 
nThreads = 1 

Perché è solo un thread viene creato nonostante mi si richiede 8?

risposta

10

Sigh. Tipico, passa ore a provare e fallire e poi trova la risposta 5 minuti dopo la pubblicazione in SO.

Il file deve essere mexed con il supporto OpenMP

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

Lo so che si sentono, fratello. – CptSupermrkt

+0

qual è l'opzione equivalente in linux con gcc come compilatore? '-fopenmp'? – linello

+1

@linello Sì. In realtà ho solo perso un paio d'ore perché non stavo passando '-fopenmp' correttamente. Devi passarlo sia al compilatore che al linker. 'mex CXXFLAGS =" \ $ CXXFLAGS -fopenmp "LDFLAGS =" \ $ LDFLAGS -fopenmp "[altre opzioni] ' per C++. (Per C, usa 'CFLAGS' invece di' CXXFLAGS', sia per C che per C++, usa entrambi.) –