gpt4 book ai didi

c++ - 如何在 C++ TBB 中创建线程池?

转载 作者:行者123 更新时间:2023-11-30 00:56:16 26 4
gpt4 key购买 nike

我可能没有正确衡量这一点,但我正在使用一些简单的代码。我不认为它是一个线程池,因为如果我使工作单元非常大,那么 cpu 会达到 190-199%(我有双核),但如果我降低工作单元的大小,但这些单元比我的 cpu 多得多以 140-160% 的速度运行程序。

我认为正在发生的事情是线程没有被合并,而是在需要时被销毁/创建,这使得程序在工作负载较小时变慢。我正在使用 tbb::task_scheduler_init 来控制线程数,但我不知道如何告诉 tbb 使线程保持事件状态。

下面是一些代码来说明这个问题:

#include <iostream>
#include <list>
#include <tbb/task.h>
#include <tbb/task_group.h>
//#include <stdlib.h>
#include "tbb/task_scheduler_init.h"
#include <boost/thread.hpp>

using namespace tbb;


long fib(long a)
{
if (a < 2) return 1;

return fib(a - 1) + fib(a - 2);
}

class PrintTask
{
public:
void operator()()
{
//std::cout << "hi world!: " << boost::this_thread::get_id() << std::endl;

fib(10);
}
};

int main()
{
tbb::task_scheduler_init init(4); //creates 4 threads
task_group group;


for (int i = 0; i < 2000000; ++i)
{
group.run(PrintTask());
//std::cout << i << std::endl;
}

std::cout << "done" << std::endl;
group.wait();

return(0);
}

如果将 fib 更改为 40-45,每个线程的工作量会变大,因此会达到全速,但如果您使用当前设置,则工作量会非常小,但会完成很多。

注意:我注意到可能相关的一件事是,在上述情况下,它完全使用了我的内存(4 gigs 免费)。经济放缓可能与此有关吗?另外为什么这个程序会占用所有内存?它是什么将它存储在内存中,如果我只是调用线程,是不是有一个队列告诉它要运行多少次,或者它是否将整个线程保存在内存中以运行?

我阅读了教程,但仍然对其行为感到困惑(尽管我确实得到了预期的结果)。

最佳答案

您不应该太担心 CPU 利用率,而应该关注执行时间和加速与顺序。

关于 tbb,您需要了解以下几点:

您可以认为安排任务的开销基本上是恒定的(虽然不完全是,但已经足够接近了)。您安排的工作量越小,就越接近这个常数。如果您接近这个常量,您将看不到加速。

线程在找不到工作时也会空闲。我猜测当您调用“fib(10)”时,调用 run 的成本和必要的任务分配正在接近实际执行工作的成本。

更具体地说,如果您确实有 2000000 个项目执行相同的任务,您可能应该调用 parallel_for 或 parallel_for_each。

-瑞克

关于c++ - 如何在 C++ TBB 中创建线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10602429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com