我正在使用mex文件测试一个基本的openmp并行化代码。麻烦的是它似乎只运行一个线程,尽管我的方向是用2个线程来运行它。这是代码:
#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
显示由于某种原因,只创建了一个线程。对于我在更复杂的代码上遇到的问题,这是一个简单的测试。当我在没有使用mex的情况下将其作为普通的c ++文件运行时,相同的代码似乎工作正常。
感谢任何帮助。谢谢! 亚洲时报Siddharth
答案 0 :(得分:2)
这是一个非常常见的错误:omp_get_num_threads()
返回当前团队中的线程数。当在parallel
区域之外调用时,它总是返回1,因为根据定义,OpenMP程序仅在并行区域之外的单个线程(主线程)执行。
omp_set_num_threads()
的补充电话是omp_get_max_threads()
。
另请注意,在编写模块和库函数时,调用omp_set_num_threads()
是一种非常糟糕的编程习惯。原因是它修复了后续所有并行区域的线程数,因此可能会影响其他代码。更好的方法是使用num_threads
子句:
#pragma omp parallel num_threads(2)
{
// ...
}
答案 1 :(得分:1)
好的,我做了一些研究,结果发现mexopts.sh文件中的CXXOPTIMFLAGS也需要更改。所以到编译行我添加了:
CXXOPTIMFLAGS="\$CXXOPTIMFLAGS -fopenmp"
这似乎可以胜任。
感谢您的帮助!