2016-08-07 1 views
1

J'ai essayé d'utiliser task_scheduler_init pour contrôler le nombre de threads dans mon programme. Cependant, il semble que peu importe le nombre de threads que je définis, le nombre maximum de threads est de 32. J'utilise i7 et il a 8 cœurs logiques. Par exemple, j'ai défini task_scheduler_init comme ceci.Pourquoi je ne peux pas créer de threads de plus de 32 en utilisant tbb :: task_scheduler_init?

tbb::task_scheduler_init init(100); 

En fait, le nombre de threads est 32. J'ai essayé d'utiliser limited_arena pour briser la limitation, mais a échoué. enter image description here

+0

Combien de noyaux avez-vous sur votre machine? Juste curieux si cela l'affecte. –

+0

J'utilise i7 et il a 8 cœurs logiques. Je ne connais pas la relation entre 8 et 32 ​​ans. –

Répondre

1

Il s'agit d'une limite stricte pour le planificateur de tâches TBB. L'idée est que le planificateur de tâches est pour un parallélisme computationnel. Il n'y a aucune raison d'augmenter le nombre de threads beaucoup plus élevé que le nombre de threads matériels si vous travaillez activement sur quelque chose. Cela entraîne des frais généraux de surinscription lorsque le système d'exploitation commence trop souvent à changer de contexte de thread.

Le planificateur de tâches TBB n'est pas conçu pour prendre en charge les unités d'exécution qui se bloquent dans le système d'exploitation (par exemple pour les E/S). Si vous souhaitez utiliser TBB avec des tâches d'E/S, veillez à utiliser des E/S asynchrones à la place. Cependant, TBB reconnaît que les conceptions d'applications sont rarement parfaites et permet donc ce sur-abonnement 4x. Une autre solution consiste à créer et à gérer votre propre thread à l'aide de std::thread (TBB fournit son propre wrapper pour les anciens compilateurs dans l'en-tête "tbb/compat/thread").

0

Il semble que l'utilisation de ce fichier de tête pourrait aider à casser la limitation.

#define TBB_PREVIEW_GLOBAL_CONTROL 1 
#include <tbb/global_control.h> 
tbb::global_control MAXTHREADS(tbb::global_control::max_allowed_parallelism, aMaximumNumberOfThreads);//put it in a code block. 

Cependant, je ne suis pas sûr si c'est en effet utile ou assez précis. Parce que quand j'utilise l'intel vTune pour exécuter le profileur hotspot. Le nombre de threads est différent de ce que je définis lorsque je définis un grand nombre de threads, par exemple 100;