经过预定的迭代后,Matlab-mex代码中的计数器不会停止

时间:2019-06-07 01:43:44

标签: matlab openmp mex

我正在使用OpenMP在Matlab中的mex文件中运行一个循环,并且在达到预定的迭代次数后它并没有停止。

我使用以下命令编译文件:

mex myfile.c CFLAGS= \$CFLAGS -fopenmp LDFLAGS=\$LDFLAGS -fopenmp

我的代码如下:

#include <stdio.h>\n'
#include "mex.h"\n'
#include "omp.h"\n'

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    int i;
    int numthreads = 8;
    #pragma omp parallel for default(none) num_threads(numthreads) private(i)
    for (i = 0; i < 20; i++) {
        int tid = omp_get_thread_num();
        printf("Hello world number %d from omp thread %d\n", i, tid);
    }
}

我希望通过“ Hello world 19 ...”得到“ Hello world 0 ...”,无论顺序如何,都只是其中之一。相反,它们会无限期地重复。

Hello world number 0 from omp thread 0
Hello world number 1 from omp thread 0
Hello world number 2 from omp thread 0
Hello world number 3 from omp thread 1
Hello world number 4 from omp thread 1
Hello world number 5 from omp thread 1
Hello world number 12 from omp thread 4
Hello world number 13 from omp thread 4
Hello world number 16 from omp thread 6
Hello world number 17 from omp thread 6
Hello world number 18 from omp thread 7
Hello world number 19 from omp thread 7
Hello world number 6 from omp thread 2
Hello world number 7 from omp thread 2
Hello world number 8 from omp thread 2
Hello world number 8 from omp thread 2
Hello world number 9 from omp thread 3
Hello world number 10 from omp thread 3
Hello world number 11 from omp thread 3
Hello world number 14 from omp thread 5
Hello world number 15 from omp thread 5
Hello world number 0 from omp thread 0
Hello world number 1 from omp thread 0
Hello world number 2 from omp thread 0
Hello world number 12 from omp thread 4
Hello world number 13 from omp thread 4

1 个答案:

答案 0 :(得分:2)

printf被翻译为mexPrintf,这将导致给定格式的字符串显示在MATLAB命令窗口中。您在这里没有使用C库printfmex.h声明了进行翻译的宏。

MATLAB MEX接口不是线程安全的。您不能从主线程以外的任何线程调用这些函数。

因此,您可能会遇到由于从多个线程调用mexPrintf而导致的一些未定义行为。

作为一种解决方法,请考虑写入文件。 fprintf不会被MEX界面取代,但是您不能使用它来写入MATLAB命令窗口。