8
私はOpenMPを初めて使用しています。私はMSVS2010で設定されたMatlab mexを使って細かくコンパイルする次のコードを持っています。コンピュータには8つのプロセッサがあります(これもmatlabpoolを使ってチェックしました)。mexファイルのOpenMPが1スレッドしか生成しないのはなぜですか?
#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");
}
私が手出力は一つのスレッドだけが、私は8を要求するにもかかわらず、作成されているのはなぜ
n=600000000
nThreads = 1
のですか?
でmexedする必要があります。 – CptSupermrkt
コンパイラとしてgccを使用してlinuxで同等のオプションは何ですか? '-fopenmp'? – linello
@linelloはい。実際に '-fopenmp'を正しく渡していなかったので、実際には数時間を無駄にしました。コンパイラとリンカの両方に渡す必要があります。 'mex CXXFLAGS =" \ $ CXXFLAGS -fopenmp "LDFLAGS =" \ $ LDFLAGS -fopenmp "[その他のオプション]' for C++。 (Cでは 'CXXFLAGS'の代わりに' CFLAGS'を使います; CとC++の両方には両方を使います) –