我有以下简单的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,我觉得我已经做到了。
有谁可以帮助我?
所以我想明白了是什么问题,所以在这里发帖,以防有人遇到同样的问题。
编译与 mex -v CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" MEXTESTER.c
做到了。我不知道为什么我必须使用CFLAGS,因为据我所知,mex的文档规定这是针对macOS或linux的。
此外,我还必须删除 printf()
语句,如果我试图从并行区域内的线程0以外的任何地方打印,MATLAB就会崩溃。如果我试图从平行区域内的线程0以外的任何地方打印,MATLAB就会崩溃。