Mex OpenMP C code

Hi,
I tried to use OpenMP in Matlab 2018a. My code is very simple, called testOpenMP.c.
I successfully compiled the code by mex -v testOpenMP.c CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp"
However, we I run the compile mex extension by just typing testOpenMP in Matlab's command window. It always crashed.
Do you know how to correctly compile such an openmp c code and run it?
Thanks,
#include "mex.h"
#include "math.h"
#include "stdio.h"
#include <omp.h>
void mexFunction(
int nargout,
mxArray *pargout [ ],
int nargin,
const mxArray *pargin [ ]
) {
int thread_count = 32;
#pragma omp parallel for default(none)
for(int i = 0; i < 32; i++)
{
printf("Hello from %d\n",i);
}
}

5 个评论

Jan
Jan 2019-1-22
编辑:Jan 2019-1-22
I've formatted the code to make it readable. You can do this by your own also.
What do you observe? "It always crashed" is not really clear.
Whenever I ran the compiled code, the Matlab automatically shuts down.
Jan
Jan 2019-1-22
编辑:Jan 2019-1-22
Does this happen also, if you omit the #pragma line?
Which compiler do you use?
It will not happen if I omit the #pragma line.
I used gcc 6.5
Did you find any solution? I am facing the exact same issue with a FORTRAN subroutine using MEX configured with a gfortran-6 compiler.
It runs fine when it is compiled without the -fopenmp flag, but MATLAB shuts down when the subroutine is called after using the -fopenmp flag during compilation. This happens even if I do not use any OMP_PARALLEL (equivalent to C's #pragma omp parallel) construct in the code.

请先登录,再进行评论。

回答(2 个)

sjhstone
sjhstone 2020-8-19
编辑:sjhstone 2020-8-19

0 个投票

Both printf and mexPrintf are not thread-safe and should be avoided in multi-thread OpenMP MEX C codes.
You can get more information at https://walkingrandomly.com/?p=1795

类别

帮助中心File Exchange 中查找有关 Write C Functions Callable from MATLAB (MEX Files) 的更多信息

产品

标签

编辑:

2020-8-19

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by