我在群集上运行Intel TBB。但是,我不知道如何检查活动和正在运行的线程数。有办法检查吗?
假设我有16个内核,所以我想知道现在我的TBB代码中是否正在使用所有16个内核。这样可以确保我的系统没有问题。
我想知道我的TBB代码中是否正在使用所有16个内核。
正确的假设是,在TBB中请求或期望多个线程并不总是导致创建或随后处理用户代码的线程数量。TBB遵循可选的并行性范例,该范例不保证特定数量的线程可以同时工作。而且,即使TBB创建了足够多的线程,也并不意味着所有线程都能够加入给定的用户代码。task_scheduler_init
并task_arena
仅指定工作线程数的限制。
您可以task_scheduler_observer
用来监视创建了多少个工作线程以及真正加入了您关注的任务领域的线程。
该博客提供了有关如何计算已创建的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单元测试源文件中实现的。它可以跟踪并行运行的特定任务实例的数量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句