C++ Mex文件在并行编译的情况下以串行方式执行

C++ Mex文件在并行编译的情况下以串行方式执行,c++,multithreading,openmp,mex,C++,Multithreading,Openmp,Mex,我正在用一个mex文件测试一个基本的openmp并行代码。问题是,它似乎只运行一个线程,尽管我指示它运行两个线程。代码如下: #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

我正在用一个mex文件测试一个基本的openmp并行代码。问题是,它似乎只运行一个线程,尽管我指示它运行两个线程。代码如下:

#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;
}
在详细的描述中,fopenmp标志出现了,所以我猜它正在编译为并行的

我得到的结果是-

1
Hello! 0
Hello! 1
Hello! 2
Hello! 3
Hello! 4
Hello! 5
Hello! 6
Hello! 7
Hello! 8
Hello! 9
显示由于某种原因,只创建了一个线程。这是一个针对我在更复杂的代码中面临的问题的简单测试。当我把它作为一个普通C++文件而不使用MEX时,同样的代码看起来很好。 感谢您的帮助。非常感谢。
Siddharth

这是一个极其常见的错误:
omp_get_num_threads()
返回当前团队中的线程数。当在
并行
区域外调用时,它总是返回1,因为根据定义,OpenMP程序仅在并行区域外使用单个线程(主线程)执行

omp\u set\u num\u threads()
的补充调用是
omp\u get\u max\u threads()

还要注意,在编写模块和库函数时,调用
omp\u set\u num\u threads()
是一种非常糟糕的编程实践。原因是它固定了后面所有并行区域的线程数,因此可能会影响其他代码。更好的方法是使用
num_threads
子句:

#pragma omp parallel num_threads(2)
{
   // ...
}

好的,我做了一些研究,结果发现mexopts.sh文件中的cxoptimflags也需要更改。因此,我在编译行中添加了:

CXXOPTIMFLAGS="\$CXXOPTIMFLAGS -fopenmp" 
而这似乎就完成了任务


谢谢你的帮助

你不能在任何地方打印
ithread
。此外,如果迭代次数太少(展开循环),并且只有一个cpu/core,openmp可能会决定不并行化代码。您好,我最初实际上没有for循环,只是打印ithread,结果显示只有0。而且,当我在mex中不这样做时,openmp会将其并行化。我只是因为某些原因没有为墨西哥石油公司做这件事。谢谢你的回复和评论。所以我搬到了omp_get_num_threads()和cout
CXXOPTIMFLAGS="\$CXXOPTIMFLAGS -fopenmp"