使用TBB时如何检查当前正在运行的线程数?

anh*_*ng8 2 c++ profiler multithreading tbb

我在集群上运行英特尔 TBB。但是,我不知道如何检查有多少线程处于活动状态并正在运行。有办法检查吗?

假设我有 16 个核心,所以我想知道我的 TBB 代码中是否使用了所有 16 个核心。这将确保我的系统没有问题。

Ant*_*ton 5

我想知道我的 TBB 代码中现在是否使用了所有 16 个内核。

可以正确地假设,在 TBB 中请求或期望一定数量的线程并不总是会导致创建或处理用户代码的一定数量的线程。TBB 遵循可选的并行范例,它不保证同时工作的线程的特定数量。而且,即使TBB创建了足够的线程,也不意味着所有线程都能够加入给定的用户代码;task_scheduler_inittask_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; }
};
Run Code Online (Sandbox Code Playgroud)

但它与可以显示进程中活动线程数量的外部工具没有太大区别。为了检查有多少线程正在加入您的计算区域(arena),我们可以使用预览功能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; }
};
Run Code Online (Sandbox Code Playgroud)

tbb::enumerable_thread_specific最后,可以使用 TLS(例如)直接从并行算法内部完成相同的技巧,因为它是src/test/harness_concurrency_tracker.h在 TBB 单元测试源的文件中实现的。它可以跟踪有多少特定任务实例正在并行运行