OpenMP在MATLAB C Mex文件中只产生1个线程。

问题描述 投票:0回答:1

我有以下简单的C代码,在MATLAB中使用以下方法编译mex -v COMPFLAGS="$COMPFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" MEXTESTER.c. 我使用MATLAB R2019a,在Windows 10 Home 64位上运行,有6个核心可用。Mex被配置为使用MinGW64编译器。

#include "mex.h"
#include <stdio.h>
#include <omp.h>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
    printf("max threads = %d\n",omp_get_max_threads());
#pragma omp parallel
    {
        printf("ID = %d\n",omp_get_thread_num());
        printf("nThreads = %d\n",omp_get_num_threads());
    }
    printf("End\n");
    return;

}

然而,当运行这段代码时,我得到以下输出

max threads = 6
ID = 0
nThreads = 1
End

为什么只有一个线程运行?如果我把Mex的代码搬过来,然后编译成一个普通的C文件,就会产生预期的输出(所以ID=0-5,nThreads=6)

我看过 为什么mex文件中的OpenMP只产生1个线程? 然而,答案是确保在编译时支持OpenMP,我觉得我已经做到了。

有谁可以帮助我?

c matlab openmp mex
1个回答
2
投票

所以我想明白了是什么问题,所以在这里发帖,以防有人遇到同样的问题。

编译与 mex -v CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" MEXTESTER.c做到了。我不知道为什么我必须使用CFLAGS,因为据我所知,mex的文档规定这是针对macOS或linux的。

此外,我还必须删除 printf() 语句,如果我试图从并行区域内的线程0以外的任何地方打印,MATLAB就会崩溃。如果我试图从平行区域内的线程0以外的任何地方打印,MATLAB就会崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.