如何在工作线程中重用主线程创建的OMP线程池?

2024-02-24

在我的 C++ 应用程序开始附近,我的主线程使用 OMP 并行化多个 for 循环。在第一个并行化 for 循环之后,我发现所使用的线程在应用程序的持续时间内仍然存在,并且可以使用以下命令(在 CentOS 7 中工作)重用于从主线程执行的后续 OMP for 循环:

for i in $(pgrep myApplication); do ps -mo pid,tid,fname,user,psr -p $i;done

后来在我的程序中,我从主线程启动了一个 boost 线程,其中我使用 OMP 并行化了一个 for 循环。此时,我看到创建了一组全新的线程,这具有相当大的开销。

是否可以使boost线程内的OMP并行for循环重用主线程创建的原始OMP线程池?

编辑:一些伪代码:

myFun(data)
{

    // Want to reuse OMP thread pool from main here.
    omp parallel for
    for(int i = 0; i < N; ++i)
    {
       // Work on data
    }

}


main
{

    // Thread pool created here.
    omp parallel for
    for(int i = 0; i < N; ++i)
    {
        // do stuff
    }


    boost::thread myThread(myFun) // Constructor starts thread.

    // Do some serial stuff, no OMP.

    myThread.join();


}

OpenMP 与其他线程机制的交互被故意排除在规范之外,因此在很大程度上依赖于实现。 GNU OpenMP 运行时在 TLS 中保留指向线程池的指针,并将其传播到(嵌套)团队。线程开始于pthread_create (or boost::thread or std::thread)不继承指针,因此产生一个新的池。其他 OpenMP 运行时也可能出现这种情况。

标准中有一个要求,基本上强制在大多数实现中执行这种行为。这是关于语义的线程私有变量以及如何在从同一线程分叉的不同并行区域中保留它们的值(OpenMP 标准,2.15.2 threadprivate指示 http://www.openmp.org/mp-documents/openmp-4.5.pdf#subsection.2.15.2):

非初始线程的 threadprivate 变量中的数据值保证在两个连续的活动之间持续存在parallel仅当满足以下所有条件时才区域:

  • Neither parallel区域嵌套在另一个显式并行区域内。
  • 用于执行两者的线程数parallel地区是一样的。
  • 用于执行两者的线程亲和性策略parallel地区是一样的。
  • 的价值dyn-var封闭任务区域中的内部控制变量是false在进入两者时parallel地区。

如果这些条件全部成立,并且在两个区域中都引用了 threadprivate 变量,则在各自区域中具有相同线程号的线程将引用该变量的相同副本。

除了性能之外,这可能是在 OpenMP 运行时中使用线程池的主要原因。

现在,假设由两个单独的线程分叉的两个并行区域共享同一个工作线程池。第一个线程分叉了一个并行区域,并设置了一些线程私有变量。随后,同一个线程会分叉出第二个并行区域,并在其中使用这些 threadprivate 变量。但在两个并行区域之间的某个地方,第二个线程分叉出一个并行区域,并使用同一池中的工作线程。由于大多数实现在 TLS 中保留线程私有变量,因此无法再断言上述语义。一种可能的解决方案是为每个单独的线程向池中添加新的工作线程,这与创建新的线程池没有太大区别。

我不知道有任何解决方法可以使工作线程池共享。如果可能的话,它也不会是可移植的,因此 OpenMP 的主要优势将会丧失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在工作线程中重用主线程创建的OMP线程池? 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 任务并行库周围是否有一个接口包装器,以便我可以将其交换用于单元测试?

    I asked 这个问题 https stackoverflow com questions 3362734 unit testing concurrent software what do you do不久以前 我现在知道这是一个坏主意
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐