2016-08-07 59 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任務調度程序的硬限制。這個想法是,任務調度程序是爲了計算並行性。如果你正在積極計算某些東西,沒有理由增加比硬件線程數量多得多的線程數量。當操作系統開始頻繁切換線程上下文時,會導致超額訂閱開銷。

TBB任務調度程序不是爲支持在OS中阻塞的線程(例如,用於I/O)而設計的。如果您想要將TBB與I/O任務一起使用,請確保使用異步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. 

但是,我不確定它是否確實有用或足夠精確。因爲當我使用英特爾vTune運行熱點分析器。線程數與我設置線程的相關大數量(例如100)時設置的線程數不同;

相關問題