我在集群上运行英特尔 TBB。但是,我不知道如何检查有多少线程处于事件状态和正在运行。有办法检查吗?
假设我有 16 个内核,所以我想知道我的 TBB 代码中是否现在使用了所有 16 个内核。这将确保我的系统没有问题。
最佳答案
I would like to know if all 16 cores are now being used in my TBB code.
假设在 TBB 中请求或期望多个线程并不总是导致创建此线程数或然后处理用户代码是正确的。 TBB 遵循可选的并行范式,它不保证特定数量的线程同时工作。此外,即使 TBB 创建了足够多的线程,也不意味着所有线程都能加入给定的用户代码; task_scheduler_init
和 task_arena
仅指定工作线程数的限制。
您可以使用 task_scheduler_observer
来监控创建了多少工作线程以及有多少真正加入了您关注的任务领域。
This blog提供了如何计算创建的TBB工作线程的简单代码:
class concurrency_tracker: public tbb::task_scheduler_observer {
tbb::atomic<int> num_threads;
public:
concurrency_tracker() : num_threads() { observe(true); }
/*override*/ void on_scheduler_entry( bool ) { ++num_threads; }
/*override*/ void on_scheduler_exit( bool ) { --num_threads; }
int get_concurrency() { return num_threads; }
};
但它与可以显示进程中事件线程数的外部工具没有太大区别。为了检查有多少线程加入您的计算区域(竞技场),我们可以使用预览功能TBB_PREVIEW_LOCAL_OBSERVER
:
#define TBB_PREVIEW_LOCAL_OBSERVER 1
#include <tbb/task_scheduler_observer.h>
//...
class concurrency_tracker: public tbb::task_scheduler_observer {
tbb::atomic<int> num_threads;
tbb::atomic<int> max_threads;
public:
concurrency_tracker()
: tbb::task_scheduler_observer(true) // request implicit arena observation
, num_threads(), max_thread()
{
observe(true);
}
/*override*/ void on_scheduler_entry( bool )
{
int current_num = ++num_threads; // increment instant concurrency counter
int current_max = max_threads;
while( current_max < current_num ) // update max concurrency value
current_max = max_threads.compare_and_swap(current_num, current_max);
}
/*override*/ void on_scheduler_exit( bool ) { --num_threads; }
int get_instant_concurrency() { return num_threads; }
int get_peak_concurrency() { return max_threads; }
};
最后,可以使用 TLS(例如 tbb::enumerable_thread_specific
)直接从并行算法内部完成相同的技巧,因为它在 src/test/harness_concurrency_tracker.h< 中实现
来自 TBB 单元测试源的文件。它可以跟踪有多少特定任务实例正在并行运行。
关于c++ - 如何在使用 TBB 时检查当前有多少线程正在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24810370/