Счетчик в коде Matlab-mex не останавливается после заданных итераций - PullRequest
0 голосов
/ 07 июня 2019

Я запускаю цикл в mex-файле из Matlab, используя OpenMP, и он не останавливается после достижения заранее определенного числа итераций.

Я компилирую файл с помощью этой команды:

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 0 ...» через «Hello world 19 ...», только по одному в любом порядке.Вместо этого они продолжают повторяться бесконечно.

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 Ответ

2 голосов
/ 07 июня 2019

printf переводится в mexPrintf, что приводит к отображению заданной форматированной строки в командном окне MATLAB.Вы не используете библиотеку C printf здесь.mex.h объявляет макрос для этого перевода.

Интерфейс MATLAB MEX не является поточно-ориентированным.Вы не можете вызывать эти функции из любого потока, кроме основного.

Таким образом, вы, вероятно, сталкиваетесь с неопределенным поведением, вызванным вызовом mexPrintf из нескольких потоков.

В качестве обходного пути рассмотрите возможность записив файл.fprintf не будет заменен интерфейсом MEX, но вы не можете использовать его для записи в командное окно MATLAB.

...