c++ - 如何在使用 TBB 时检查当前有多少线程正在运行?

标签 c++ multithreading profiler tbb

我在集群上运行英特尔 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_inittask_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/

相关文章:

c++ - 重印选项列表

C - Linux - Pthreads 和信号量

c++ string::npos 是调用字符串类吗?

c++ - 内联汇编,错误为

java - 如何重用线程?线程什么时候关闭?

c++ - 您最喜欢 C/C++ 性能分析器/分析器的哪些功能?

c++ - 概要分析:一行简单代码的 self 时间与总时间

javascript - 如何分析/减少 html 页面渲染时间?

c++ - 使用显式用户定义的强制转换运算符调用函数是不明确的

.net - 在 .NET 中使用线程本地存储的最佳实践是什么?