Я тестирую базовый распараллеленный код openmp с mex-файлом. Проблема в том, что он, кажется, работает только с одним потоком, несмотря на мое указание запускать его с двумя потоками. Вот код:
#include "mex.h"
#include "omp.h"
#include <iostream>
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
using namespace std;
#define x_out plhs[0]
#define x_in prhs[0]
double *x;
double y;
x_out=mxCreateDoubleMatrix(1,1,mxREAL);
x=mxGetPr(x_out);
y=mxGetScalar(x_in);
x[0]=y;
omp_set_num_threads(2);
int Nthreads=omp_get_num_threads();
cout<<Nthreads<<"\n";
#pragma omp parallel
{
int ithread=omp_get_thread_num();
#pragma omp for
for (int i=0;i<10;i++)
cout<<"Hello! " <<i<<"\n";
}
return;
}
Я использую следующую строку компиляции -
mex -v paralletestmex.cpp CC=g++ CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp"
и в подробном описании появляется флаг fopenmp, поэтому я предполагаю, что он компилирует его для параллельной работы.
Вывод, который я получаю, -
1
Hello! 0
Hello! 1
Hello! 2
Hello! 3
Hello! 4
Hello! 5
Hello! 6
Hello! 7
Hello! 8
Hello! 9
Показывает, что по какой-то причине создается только 1 поток. Это простой тест для проблемы, с которой я столкнулся в более сложном коде. Когда я запускаю это как обычный файл С++ без использования mex, тот же код работает нормально.
Любая помощь приветствуется. Благодарю вас! Сиддхарт
ithread
. Также openmp может принять решение не распараллеливать ваш код, если итераций слишком мало (развернуть цикл) и если у вас есть только один процессор/ядро. - person Lachezar   schedule 29.10.2013