2011-05-11 3 views
3

J'ai un module C++ personnalisé pour python qui expose des fonctions, dont certaines utilisent TBB (tbb21_015oss) pour accélérer le traitement.Appel de TBB 'parallel_for' dans un thread python

Jusqu'à présent, je n'avais aucun problème lors de l'appel d'une fonction TBB-accélérée à partir de Python (2.6.2) dans un environnement Win32.

Mais maintenant, j'ai un problème en appelant une telle fonction à partir d'un thread Python (créé en utilisant threading.Thread classe) - tout en appelant la même fonction, à partir du thread principal Python fonctionne très bien.

Appeler le fil de fonction plantage de l'application, avec le message suivant:

First-chance exception at 0x03522e96 in python.exe: 
0xC0000005: Access violation reading location 0x000000c8. 

adresse de base de TBB.dll est 0x03510000, et selon débogueur MSVC 2005, l'accident se produit dans le code de « l'parallel_for.h de TBB », apparemment static void start_for::run( const Range& range, const Body& body, const Partitioner& partitioner) lors de l'exécution:

start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner)); 

Il semble qu'il ya un pointeur NULL étant déréférencé.

FWIW, TBB est initialisé en utilisant le mécanisme d'initialisation différée:

// at 'global' scope 
tbb::task_scheduler_init g_tbbinit(tbb::task_scheduler_init::deferred); 
... 
// in a function 
g_tbbinit.initialize(); 

Y at-il moyen de faire ce travail? Par exemple, TBB a-t-il besoin d'une initialisation spécifique pour permettre son appel depuis un thread 'custom'?

+0

Quel est le message d'erreur? – log0

+0

@Ugo - question mise à jour pour ajouter plus d'informations – rotoglup

Répondre

2

Avec TBB 2.1, chaque thread externe qui utilise TBB doit d'abord créer son propre objet task_scheduler_init; un seul objet global ne fonctionnera pas.

Les versions ultérieures de TBB ont assoupli cette exigence; maintenant un tel objet d'initialisation spécifique au thread est créé implicitement s'il est absent.

Vous pourriez essayer si le remplacement mécanique de tbb.dll avec une version plus récente vous aidera. Recompiler le module C++ mentionné avec une version récente de TBB sera encore mieux. Le fait de retravailler le module pour initialiser TBB séparément pour chaque thread qui l'appelle (afin qu'il fonctionne aussi avec une version plus ancienne), s'il n'est pas interdit par les contraintes de conception, pourrait également avoir du sens.

+0

merci, il ressemble à ce dont j'ai besoin, j'ai du mal à comprendre cela à partir de la documentation tbb. Je vais essayer dès que possible. – rotoglup

Questions connexes