当前位置: 首页 > 知识库问答 >
问题:

使用OpenMP:开销和更改线程数的线程池

蓟清野
2023-03-14
#pragma omp parallel for
for(int i=0; i<n; i++)

#pragma omp parallel for num_threads(4)
for(int i=0; i<n; i++)

#pragma omp parallel for 
for(int i=0; i<n; i++)

这是我现在实际做的事情,因为我的部分代码使用超线程会得到更糟糕的结果,所以我将线程数降低到物理核心数(仅针对这部分代码)。如果我做了相反的事情(4个线程,然后8个,然后4个)呢?

线程池必须在每次更改线程数时重新创建吗?如果不是,添加或删除线程是否会导致任何显著的开销?

线程池的开销是多少,即每个线程有多少部分的工作流到池中?

共有1个答案

韦翰音
2023-03-14

现在回答这个问题可能已经晚了。然而,我打算这样做。

当您从一开始就用8个线程开始时,总共将创建7个线程,然后,包括您的主进程,您有一个8人的团队。因此,示例代码中的第一个循环将使用该团队执行。因此,线程池有8个线程。在他们完成这个区域后,他们进入睡眠,直到醒来。

现在,当您到达具有4个线程的第二个并行区域时,只有线程池中的3个线程被唤醒(3个线程+当前的主线程),其余的线程仍然处于睡眠模式。因此,四个线程处于睡眠状态。

然后,与第一个并行区域类似,所有线程将相互合并以完成第三个并行区域。

另一方面,如果您从4个线程开始,而第二个并行区域要求8个线程,那么OpenMP库将对此更改做出反应,并创建4个额外的线程来满足您的要求(8个线程)。通常,创建的线程直到程序生命周期结束时才被抛出池。希望你将来可能会需要它。这是大多数OpenMP库遵循的通用方法。这个想法背后的原因是,创建新线程是一项昂贵的工作,这就是为什么他们试图避免它,并尽可能推迟它。

希望这对你和未来的通勤者有所帮助。

 类似资料:
  • 问题内容: 传统观点告诉我们,大量的企业Java应用程序应优先使用线程池,而不是产生新的工作线程。使用使得这很简单。 但是,确实存在线程池不太适合的情况。我当前正在使用的具体示例是使用,它允许将变量“传递”给任何产生的线程。使用线程池时,此机制会中断,因为辅助线程通常不是从请求线程派生的,而是预先存在的。 现在有解决方法(可以将线程局部变量显式传入),但这并不总是适当或实际的。最简单的解决方案是按

  • 问题内容: 所以基本上我创建了这个程序,为redis添加了值。到目前为止,我得到了这个时机: 但是,当我尝试运行多个线程时: 我用set ot得到这个: 为什么我的程序在有 更多 线程的情况下运行 速度较慢 ? __ 我正在运行Linux Ubuntu 11.04和Python 2.7.1。 问题答案: 结果取决于Python的实现,cpython的GIL阻止了并行计算比顺序计算更快。 考虑使用该

  • 我一直在用OpenMP调用这个 在C11 std::threads中(我相信这些只是pthreads) 但是,OpenMP的实现速度是原来的两倍——更快!我本以为C11线程会更快,因为它们更低级。注意:上面的代码在一个循环中不仅被调用了一次,而且可能被调用了10000次,所以这可能与此有关吗? 编辑:为了澄清,在实践中,我要么使用OpenMP,要么使用C 11版本——不是两者都使用。当我使用Ope

  • 我的代码出错了。为什么胡虎123123

  • 主要内容:一、MySql中的线程,二、主要方式,三、源码流程,四、总结一、MySql中的线程 在mysql中,每一个连接上来,就会分配给一个相关的THD数据类。在前面的分析中可以看到,连接器(Connectors)连接到的直接就是连接池,在连接池的线程处理中分为三部分,即一对一(一个连接对应一个线程),多对一(多个连接对应一个线程)和线程池(多对多)。 线程池和线程可以针对不同的具体场景来处理具体的事务,这样既兼顾了效率又提高了适应性,对于新手来说,这就是设计的一个

  • 问题内容: 我在vserver上安装了Jenkins。当我看htop Jenkins运行30个线程时,每个线程都被允许分配247MB内存和最多1181MB虚拟内存。 因为我只有一个小的虚拟服务器,所以我尝试更改线程数。但是我找不到任何配置文件。 我通过 aptitude install jenkins安装了jenkins ,在htop中我可以看到Jenkins从以下位置运行: / usr / bi