Matlab crashes in simple MEX C "#pragma omp parallel for" test example

The program below crashes randomly (It appears to be random, it sometimes works). It feels like it might be me misunderstanding some basic thing. If so, I apologize in advance. Please let me know if I can provide more info. I compile using:
>>mex parallel.c CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp"
I am running this on Max OS 10.8.2 and Matlab 7.14.0.739 (R2012a) 64bit. My GCC version is "i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)".
PROGRAM BELOW:
#include "mex.h"
#include <omp.h>
/* Parallel part of program */
double inner_loop(){
double sum;
int p, n;
sum = 0.0;
n = 100;
#pragma omp parallel for shared(n) private(p) reduction(+: sum)
for(p = 0; p<n; p++){
sum += 1.0;
}
return sum;
}
/* Main function */
void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]
)
{
/* Initialize variables */
int i, m;
double sum;
/* Set values */
m =100;
sum = 0.0;
/* Outer loop */
for(i=0; i<m; i++){
sum += inner_loop(); // Call parallel inner loop
}
/* Output data */
plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL);
double* y = mxGetPr(plhs[0]);
y[0]=sum;
return;
}

Antworten (2)

James Tursa
James Tursa am 2 Okt. 2012
Bearbeitet: James Tursa am 2 Okt. 2012
There might be some incompatibility between the OpenMP implementation of your compiler and MATLAB. Maybe try something even simpler first and then build from there. E.g.,
#include "mex.h"
#include <omp.h>
void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]
)
{
int p, n;
double sum;
sum = 0.0;
n = 100;
#pragma omp parallel for shared(n) private(p) reduction(+: sum)
for(p = 0; p<n; p++){
sum += 1.0;
}
mexPrintf("sum = %f\n",sum);
}

1 Kommentar

Hi. Thanks for your reply.
I tried your example, compiling and running it from the command line works. I have a hunch that the problem is placing a loop outside the parallel loop (as was done in my original example). So I tried running the following m-file,
% Test code in m-file:
for i=1:1000
test(); // the script you suggested
end
which works fine. Printing the results as expected.
My explanation would be that there is a conflict between successive iterations of the outer loop if they are run in quick sequence. That they somehow collide. So I tried removing "mexPrintf("sum = %f\n",sum);" which is sort of a pause condition (is it?).
Running the test code m-file with this alteration invariably crashes my Matlab. This narrows down the problem a bit I think. Any ideas or further suggestions? (I also added my gcc version to the original question. (4.2.1))
Edit: Please also see my response below with further information.

Melden Sie sich an, um zu kommentieren.

Patrik
Patrik am 3 Okt. 2012
Bearbeitet: Patrik am 3 Okt. 2012
I have installed the newest version of Matlab (2012b) and I have not been able to reproduce the exact errors discussed above.
The example below however randomly crashes on Matlab 2012b. It works sometimes.
PROGRAM BELOW:
#include "mex.h"
#include <omp.h>
void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]
)
{
int p, n, i, m;
double sum;
sum = 0.0;
n = 100;
m = 100;
for(i = 0; i<m; i++){
#pragma omp parallel for shared(n) private(p) reduction(+: sum)
for(p = 0; p<n; p++){
sum += 1.0;
}
}
mexPrintf("%f",sum);
}

1 Kommentar

Hi Patrik,
At the omp directive line, try including the reduction variable "sum", in the list of shared variables or replacing "shared(n)" with "default(shared)"
Hopefully, that should alleviate the crashing.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Write C Functions Callable from MATLAB (MEX Files) finden Sie in Hilfe-Center und File Exchange

Produkte

Gefragt:

am 2 Okt. 2012

Kommentiert:

am 28 Jan. 2014

Community Treasure Hunt

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

Start Hunting!

Translated by