我正在使用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
答案 0 :(得分:2)
printf
被翻译为mexPrintf
,这将导致给定格式的字符串显示在MATLAB命令窗口中。您在这里没有使用C库printf
。 mex.h
声明了进行翻译的宏。
MATLAB MEX接口不是线程安全的。您不能从主线程以外的任何线程调用这些函数。
因此,您可能会遇到由于从多个线程调用mexPrintf
而导致的一些未定义行为。
作为一种解决方法,请考虑写入文件。 fprintf
不会被MEX界面取代,但是您不能使用它来写入MATLAB命令窗口。