【问题标题】:How do I use tbb::parallel_invoke to run large number of tasks in parallel?如何使用 tbb::parallel_invoke 并行运行大量任务?
【发布时间】:2014-02-24 02:28:26
【问题描述】:

我的问题类似于生产者-消费者问题。例如我需要并行运行 999 个生产者和 1 个消费者。基本上所有 999 个生产者都做同样的任务。

【问题讨论】:

  • 如果 999 个生产者为单个消费者提供服务,您似乎不太可能获得显着的并行加速,除非消费者所做的工作大约是生产者的 1/1000。一般来说,高扇出或高扇入是不可扩展的,除非重新组织为较低扇出/输入节点的树。生产者是否需要强制或可选并发?即,它们必须交错,还是可以在其他一些开始之前运行完成?
  • 是的,生产者需要并发。我正在设计一个数据结构,将由生产者和消费者同时访问,即生产者生产和消费者同时消费。可能存在多个生产者和多个消费者、多个消费者和单个生产者的情况。

标签: tbb parallel-for


【解决方案1】:

TBB(以及 Cilk Plus 和 PPL)等并行框架专注于可选的并发性,这使它们能够获得足够的数据以保持机器繁忙但不会使其过载。

如果生产者之间的并发是必需的,那么大多数 TBB 构造是不合适的。例如,tbb::parallel_for 不承诺它会并行运行任何东西。如果目前可用,它只使用并行性。对于强制并发,您需要为每个生产者提供单独的std::thread。在运行 999 个线程的情况下,除非您有一台具有 999 个硬件线程的机器,或者大部分时间保持大部分线程处于休眠状态(例如,通过使用条件变量),否则不要期望有太多的加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多