2011-05-11 5 views
3

私は、処理を高速化するためにTBB(tbb21_015oss)を使用する関数を公開するPython用のカスタムC++モジュールを用意しています。PythonスレッドでTBB 'parallel_for'を呼び出す

これまでは、Win32環境でPython(2.6.2)からTBB-accelerated関数を呼び出すときに問題はありませんでした。

しかし、(Pythonスレッド(threading.Threadクラスを使用して作成)からこのような関数を呼び出すときに問題が発生します。メインのPythonスレッドから同じ関数を呼び出しても問題ありません。

次のメッセージで、アプリケーションのクラッシュへの関数のリードを呼び出す:

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

TBB.dllベースアドレスは0x03510000で、MSVC 2005デバッガーによると、クラッシュがTBBの「parallel_for.hからコードで起こります」、明らかにstatic void start_for::run( const Range& range, const Body& body, const Partitioner& partitioner)で実行したとき:

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

逆参照されているNULLポインタがありますようです。

FWIW、TBBは、繰延初期化メカニズムを使用して初期化されます:

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

は、この作品を作るための方法はありますか?たとえば、TBBは「カスタム」スレッドから呼び出されるためには特定の初期化が必要ですか?

+0

エラーメッセージは何ですか? – log0

+0

@Ugo - 詳細情報を追加するための更新された質問 – rotoglup

答えて

2

TBB 2.1では、TBBを使用する各外部スレッドは、最初に独自のtask_scheduler_initオブジェクトを作成する必要があります。単一のグローバルオブジェクトは機能しません。

TBBのそれ以降のバージョンは、この要件を緩和しました。このようなスレッド固有の初期化オブジェクトは、存在しなければ暗黙的に作成されます。

tbb.dllを機械的に置き換えると、より新しいバージョンが役立つかどうか試してみることもできます。前述のC++モジュールをTBBの最新バージョンで再コンパイルすると、さらに優れたものになります。 TBBを呼び出すスレッドごとに別々にTBBを初期化するためにモジュールを再構築することで、設計上の制約によって禁止されていなければ、より古いバージョンでも動作するようになります。

+0

私は必要なもののように見えますが、tbbのドキュメントからこれを理解するのは苦労しています。私はそれをできるだけお試しください。 – rotoglup

関連する問題