Je demande seulement ceci pour essayer de comprendre ce que j'ai passé 24 heures à essayer de résoudre.Matlab limite TBB mais pas OpenMP
Mon système: Ubuntu 12.04.2, Matlab R2011a, tous les deux 64 bits, le processeur Intel Xeon basé sur Nehalem. Le problème est simple, Matlab permet aux programmes basés sur OpenMP d'utiliser tous les cœurs de processeurs avec l'hyper-threading activé mais ne permet pas la même chose pour TBB. Lors de l'exécution de TBB, je ne peux lancer que 4 threads, même si je change le nombre maxNumCompThreads à 8. Avec OpenMP, je peux utiliser tous les threads que je veux. Sans Hyper-Threading, TBB et OpenMP utilisent tous les 4 cœurs bien sûr.
Je comprends Hyper-threading et que son virtuel, mais la limitation matlab fait, effectivement fait une pénalité sur la performance (un reference supplémentaire).
J'ai testé cette question à l'aide de 2 programmes, un simple boucle avec
#pragma omp parallel for
et une autre boucle très simple basé sur un exemple de code TBB.
tbb::task_scheduler_init init(tbb::task_scheduler_init::deferred);
tbb::parallel_for_each(tasks.begin(),tasks.end(),invoker<mytask>());
et enveloppé les deux avec une fonction mex matlab.
Quelqu'un at-il une explication à cela? Y a-t-il une différence inhérente dans la méthode ou la structure de création de thread qui permet à matlab d'étrangler TBB mais n'autorise pas ce throttoling pour OpenMP?
Code pour référence:
OpenMP:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
threadCount = 100000;
#pragma omp parallel for
for(int globalId = 0; globalId < threadCount ; globalId++)
{
for(long i=0;i<1000000000L;++i) {} // Deliberately run slow
}
}
TBB:
#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>
#include "mex.h"
struct mytask {
mytask(size_t n)
:_n(n)
{}
void operator()() {
for (long i=0;i<1000000000L;++i) {} // Deliberately run slow
std::cerr << "[" << _n << "]";
}
size_t _n;
};
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const
mxArray* prhs[]) {
tbb::task_scheduler_init init(tbb::task_scheduler_init::deferred); // Automatic number of threads
std::vector<mytask> tasks;
for (int i=0;i<10000;++i)
tasks.push_back(mytask(i));
tbb::parallel_for_each(tasks.begin(),tasks.end(),invoker<mytask>());
}
Essayez d'initialiser 'tbb :: task_scheduler_init' avec' 8' au lieu d'utiliser 'différé'. –
essayez de contrôler explicitement le nombre de threads: 'maxNumCompThreads' dans MATLAB, la fonction' omp_set_num_threads' ou la variable d'environnement 'OMP_NUM_THREADS' pour OpenMP, et [équivalent] (http://stackoverflow.com/q/3786408/97160) pour TBB – Amro
J'ai essayé vos deux suggestions, je n'ai pas travaillé. – omarzouk