OpenMP в MATLAB C Mex файл создает только 1 поток - PullRequest
1 голос
/ 05 мая 2020

У меня есть следующий простой код C, который скомпилирован в MATLAB с использованием mex -v COMPFLAGS="$COMPFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" MEXTESTER.c. Я использую MATLAB R2019a, работающий на Windows 10 Home 64-бит с 6 доступными ядрами. Mex настроен на использование компилятора MinGW64.

#include "mex.h"
#include <stdio.h>
#include <omp.h>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
    printf("max threads = %d\n",omp_get_max_threads());
#pragma omp parallel
    {
        printf("ID = %d\n",omp_get_thread_num());
        printf("nThreads = %d\n",omp_get_num_threads());
    }
    printf("End\n");
    return;

}

Однако при запуске этого кода я получаю следующий результат:

max threads = 6
ID = 0
nThreads = 1
End

Почему выполняется только 1 поток? Если я перенесу код из Mex и просто скомпилирую его как обычный файл C, это даст ожидаемый результат (поэтому ID = 0-5 и nThreads = 6)

Я прочитал Почему OpenMP в mex-файле создает только 1 поток? , однако ответ заключался в том, чтобы обеспечить поддержку OpenMP при компиляции, что, как мне кажется, я уже сделал.

Кто может помочь?

1 Ответ

2 голосов
/ 05 мая 2020

Итак, я понял, что было не так, поэтому разместите здесь сообщение на случай, если кто-то столкнется с той же проблемой.

Компиляция с mex -v CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" MEXTESTER.c сделала свое дело. Не уверен, почему мне пришлось использовать CFLAGS, хотя, насколько я могу судить, в документации mex указано, что это для macOS или linux.

Более того, мне также пришлось удалить операторы printf() из параллельной области. Если я пытался печатать из чего-либо, кроме потока 0 внутри параллельной области, MATLAB просто разбился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...