2016-08-07 25 views
1

プログラムのスレッド数を制御するためにtask_scheduler_initを使用しようとしました。しかし、どれくらいのスレッドを設定しても、スレッドの最大数は32です。私はi7を使用し、8つのロジックコアを持っています。 たとえば、このようにtask_scheduler_initを設定します。tbb :: task_scheduler_initを使用して32以上のスレッドを作成できないのはなぜですか?

tbb::task_scheduler_init init(100); 

実際にスレッド数は32です。制限を破るためにlimited_arenaを使用しようとしましたが、失敗しました。 enter image description here

+0

マシンにはいくつのコアがありますか?これがそれに影響を与えるかどうか不思議です。 –

+0

私はi7を使用し、8つのロジックコアを備えています。私は8と32の関係を知らない。 –

答えて

1

これは、TBBタスクスケジューラのハード制限です。タスクスケジューラは計算並列性のためのものです。積極的に何かを計算している場合、スレッドの数をハードウェアスレッドの数よりもはるかに多くする必要はありません。 OSがスレッドコンテキストを頻繁に切り替えるようになると、サブスクリプションオーバーヘッドが発生します。

TBBタスクスケジューラは、OSにブロックされているスレッド(I/Oなど)のサポート用に設計されていません。 I/Oタスクと共にTBBを使用する場合は、代わりに非同期I/Oを使用してください。しかし、TBBはアプリケーションの設計が完璧であるとは認識していないため、この4倍超過契約が可能です。別の方法は、std::thread(TBBは"tbb/compat/thread"ヘッダーの古いコンパイラ用の独自のラッパーを提供)を使用して独自のスレッドを作成して管理することです。

0

このヘッダーファイルを使用すると、制限を破るのに役立つようです。

#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. 

しかし、本当に有用か正確かはわかりません。なぜなら私はhotspotプロファイラを実行するためにIntel vTuneを使うからです。スレッドの数は、関連するスレッド数を100に設定すると設定したものとは異なります。

関連する問題