c++ - 尽管并行编译,Mex 文件还是串行执行

标签 c++ multithreading openmp mex

我正在使用 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

显示由于某种原因,仅创建了 1 个线程。这是针对我在更复杂的代码上遇到的问题的简单测试。当我在不使用 mex 的情况下将其作为纯 C++ 文件运行时,相同的代码似乎工作正常。

感谢任何帮助。谢谢你! 悉达多

最佳答案

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

omp_set_num_threads() 的补充调用是 omp_get_max_threads()

另请注意,在编写模块和库函数时,调用 omp_set_num_threads() 是一种非常糟糕的编程习惯。原因是它固定了后续所有并行区域的线程数量,因此可能会影响其他代码。更好的方法是使用 num_threads 子句:

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

关于c++ - 尽管并行编译,Mex 文件还是串行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19645510/

相关文章:

c++ - 关于 OMP barrier 和动态数组

c++ - C++ 编译器是否允许仅使用构造来替换构造+移动构造?

c++ - 在 Visual Studio 2008 C++ 的 header 中自动指定 .LIB

c++ - 在 Qt 中使用完成信号退出线程并进行 clean_up 的正确方法

c++ - 编写 std::vector 与普通数组的线程安全

c++ - 使用 OpenMP 的并行执行比串行执行 C++ 花费的时间更长,我是否以正确的方式计算执行时间?

c++ - 没有按钮图像的 CMFCEditBrowseCtrl

c++ - 替代上一版 Boost asio 库中缺少的方法

android - 如何显示进度条?

java - 为什么多线程在这个程序中不起作用?