我可以将多个线程分配给 OpenMP 中的代码段吗?

2024-04-24

我正在寻找一种方法来并行执行代码部分,每个部分使用多个线程。例如,如果我有 16 个线程和两个任务,我希望每个线程有 8 个线程同时执行这两个任务。 OpenMP 有多种构造(section, task)并行执行一般代码,但它们是单线程的。在我的场景中,使用section or task将导致一个线程执行这两个任务中的每一个,而 14 个线程闲置。

OpenMP 可以实现类似的功能吗?如果是这样,我该怎么做,如果不是,我可以用什么来达到这个目的?

谢谢你的时间!

edit 2:

让我用示例代码来扩展这个问题:

class some_class{
    void task(){
        cout<<"Entering the task method"<<endl;
        #pragma openmp parallel for
            for(int i=0; i < large_matrix.rows(); i++){
                 perform_thread_safe_operation(large_matrix.getRow(i));
            }
    }

    matrix large_matrix;
};


void main(){
    //I have 16 cores, so I want to spawn 16 threads
     some_class o1;
     some_class o2;
    // I want 8 of the 16 threads to execute this line:
    o1.task();
    // and 8 remaining threads to execute this line:
    o2.task();
}

您可以使用嵌套并行区域来完成此操作。

omp_set_nested(1);

#pragma omp parallel num_threads(2)
{
    if (omp_get_thread_num() == 0){
#pragma omp parallel num_threads(8)
        {

            //  Task 0

        }
    }else{
#pragma omp parallel num_threads(8)
        {

            //  Task 1

        }
    }
}

或者,您可以这样做:

#pragma omp parallel num_threads(16)
{
    if (omp_get_thread_num() < 8){
        //  Task 0
    }else{
        //  Task 1
    }
}

请注意,如果 OpenMP 决定使用少于 16 个线程,则此代码将不起作用。您必须为此插入自己的清理代码。

编辑:响应您的更新:

class some_class{
    void task(){
        cout<<"Entering the task method"<<endl;

#pragma omp parallel for num_threads(8)
        for(int i=0; i < large_matrix.rows(); i++){
            perform_thread_safe_operation(large_matrix.getRow(i));
        }
    }

    matrix large_matrix;
};


void main(){

    omp_set_nested(1);

    //I have 16 cores, so I want to spawn 16 threads
     some_class o1;
     some_class o2;

#pragma omp parallel num_threads(2)
   {
       if (omp_get_thread_num() == 0){
           // I want 8 of the 16 threads to execute this line:
           o1.task();
       }else{
           // and 8 remaining threads to execute this line:
           o2.task();
       }
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将多个线程分配给 OpenMP 中的代码段吗? 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • 插入新行后如何获取它的 GUID 值? [复制]

    这个问题在这里已经有答案了 我正在尝试获取 Sqlserver 中新插入记录的 Id 我已经检查过Scope Identity 但这据说返回自动增量列的值 我用于 Id 的列是 Guid 我想要插入后的 Guid 列值 这应该如何实现 或者
  • Angular-UI 日期选择器无法在具有隔离范围的指令中工作

    我有一个问题 我认为与我的指令的隔离范围有关 从弹出窗口中选择日期后 Angular UI 弹出日期选择器将不会再次出现在指令中 在指令之外 即使选择了日期 弹出窗口也会继续正常运行 出于演示目的 我使用了完全相同的标记和属性来显示弹出窗口
  • 将多个平面文件导入到多个 SQL 表

    这是我的文件夹设置 这是文件设置 这个想法是遍历文件夹并将文件内容放入数据库上的表 File dbo 还有 FileB FileC 等 所有文件夹的文件名结构都相同 我有这个 ssis 包 我在其中使用 foreachloop gt 数据流
  • 如何减慢和停止当前的 jQuery 动画?

    jQuery 问题 我将动画 block 向右移动 5000px block animate left 5000px 2000 linear 我需要的是在点击后慢慢停止这个动画 clickme click function stop blo
  • TensorFlow:张量不是该图的元素

    file for inputing the data for testing from scipy import ndimage image file test png image data ndimage imread image fil
  • 将 Eclipse 的“开放调用层次结构”过滤为仅我的公司/项目

    我最喜欢的 Eclipse 功能之一是能够打开调用者 被调用者层次结构 http eclipse tools sourceforge net call hierarchy index html的一个方法 默认情况下 该视图显示对我的代码库之
  • 浏览器什么时候开始支持每个标签多个类?

    在当前的 Web 浏览器中 您可以在 HTML 标记中使用多个 css 类 例如 div class style1 style2 style3 foo bar div 但这并不总是有效 主要浏览器从哪些版本开始正确支持此功能 Wayne K
  • 在 Powershell 中将多个输出发送到同一个 HTML 文件

    试图弄清楚如何将多个服务检查转换为 HTML 我有这个脚本 Get service Computername SERVER1 Name SERVICE1 ConvertTo Html Body h2 Service 1 Check h2 P
  • ToProperty 和 BindTo - 无需订阅即可获取初始值

    我在 NET 4 5 中使用 RXUI 6 和 WPF 当绑定到的 ViewModel 属性由一个支持时 我一直无法获取提供给我的视图的初始值ObservableAsPropertyHelper 根据文档 https github com
  • 如何在远程计算机上调试 war 文件?

    如果我有一个 jboss 服务器在另一台机器上运行 并且我将我的 war 文件 scp 到该机器 我该如何调试 war 我会使用什么命令 如何在我的终端中执行此操作 在远程计算机上使用调试参数运行 jboss Xdebug Xrunjdwp
  • 将 Excel 行输出到一系列文本文件

    在 Excel 中 我在 A 列中有一个文章名称列表 在 B 列中有一个免责声明 现在 对于 A 列中的每篇文章 我想创建一个文本文件 A 是文件的标题 B 是文件的标题 免责声明是文件的内容 这可能吗 我的想法是 我有数百个这样的东西 我
  • 如何 .gitignore 文件夹中的所有文件/文件夹,但不忽略文件夹本身? [复制]

    这个问题在这里已经有答案了 我想将一个空白文件夹签入我的 Git 存储库 实际上 我需要忽略文件夹中的所有文件和文件夹 但不是文件夹本身 我怎样才能做到这一点 我应该在我的 gitignore file 对于那些想知道为什么我要这样做的人
  • 使用这种语法的原因是什么 (0, _.Em)();

    在研究 google plusone 脚本时 我多次看到以下语法 0 Em 假设 Em是一个函数 上面的语句将导致调用该函数 这是非常明显的 另一方面 如果它是未定义的 结果岂不是与简单地执行相同 Em 任何人都可以阐明使用这种语法背后的想
  • 2018 年模块内测试/模拟功能的最新技术是什么?

    我有一个用于学习测试的模块 如下所示 api js import axios from axios const BASE URL https jsonplaceholder typicode com const URI USERS user
  • Google 地图 iOS SDK 和故事板

    我希望有人能解释如何开始使用 Google 地图和 Xcode 故事板 我找不到任何有关如何实际操作的信息 我只需要一个例子或采取的步骤 有这个http www youtube com watch v r3H8dFG0UCY http ww
  • PyCrypto 可以检查文件是否已经 AES 加密?

    from Crypto Cipher import AES def encrypt file key in filename out filename None chunksize 64 1024 Encrypts a file using
  • Fusion Tables 层 URL 请求限制(2048 个字符)

    我正在使用 Google 地图突出显示一些国家 并使用 Fusion Tables 来获取几何图形 您可以在此处查看一个示例 http jsfiddle net 4mtyu 689 http jsfiddle net 4mtyu 689 v
  • 使用 netcat 提供包含图像的 HTTP 响应

    我正在尝试使用 netcat 编写一个小型 HTTP 服务器 对于纯文本文件 这工作正常 但当我尝试发送图片时 浏览器仅显示损坏图像的图标 我所做的就是提取所请求文件的 mime 类型和大小 并将其发送给客户端 我的示例图片的请求标头如下所
  • 从回调中递归调用函数会导致堆栈溢出吗?

    我想在事件触发后调用一个函数 然后在同一个回调中再次调用该函数 这是为了在函数完成时创建一种事件侦听器 当你看到代码时你就会知道我想做什么 use strict var page require webpage create var sys
  • 我可以将多个线程分配给 OpenMP 中的代码段吗?

    我正在寻找一种方法来并行执行代码部分 每个部分使用多个线程 例如 如果我有 16 个线程和两个任务 我希望每个线程有 8 个线程同时执行这两个任务 OpenMP 有多种构造 section task 并行执行一般代码 但它们是单线程的 在我