mex ファイルを使用して、基本的な openmp 並列化コードをテストしています。問題は、2 つのスレッドで実行するように指示したにもかかわらず、1 つのスレッドしか実行していないように見えることです。コードは次のとおりです。
#include "mex.h"
#include "omp.h"
#include <iostream>
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
using namespace std;
#define x_out plhs[0]
#define x_in prhs[0]
double *x;
double y;
x_out=mxCreateDoubleMatrix(1,1,mxREAL);
x=mxGetPr(x_out);
y=mxGetScalar(x_in);
x[0]=y;
omp_set_num_threads(2);
int Nthreads=omp_get_num_threads();
cout<<Nthreads<<"\n";
#pragma omp parallel
{
int ithread=omp_get_thread_num();
#pragma omp for
for (int i=0;i<10;i++)
cout<<"Hello! " <<i<<"\n";
}
return;
}
次のコンパイル行を使用します-
mex -v paralletestmex.cpp CC=g++ CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp"
詳細な説明では fopenmp フラグが表示されるので、並列になるようにコンパイルしていると思います。
私が得る出力は -
1
Hello! 0
Hello! 1
Hello! 2
Hello! 3
Hello! 4
Hello! 5
Hello! 6
Hello! 7
Hello! 8
Hello! 9
何らかの理由で、1 つのスレッドのみが作成されていることを示しています。これは、より複雑なコードで直面している問題の簡単なテストです。これを mex を使用せずにプレーンな C++ ファイルとして実行すると、同じコードが正常に動作するように見えます。
どんな助けでも大歓迎です。ありがとうございました!シッダールス