使用 openMP 进行多核处理与多线程处理

2023-12-03

这个问题听起来可能很基本,但是我找不到任何具体的答案。现在假设我们有一个多核处理器,例如 corei5 680(2 个物理核心和支持 HT 的 4 个操作系统可用核心)。 我的问题是 openMP 到底适合什么情况? 1 - 当我们说使用 openMP 进行多线程处理时,它是否会自动利用所有可用核心(本例中为 4 个虚拟核心)并根据可用 CPU 周期执行线程? 2 - openmp 是否可以控制如何使用物理/虚拟核心?或者它是抽象的并提供多线程环境,比如java?

如果这听起来很基本,请原谅,但我试图在网上找到答案,但找不到任何令人满意的东西。

Thanks


这在一定程度上取决于您正在考虑的 OpenMP 版本/功能,因为我相信更高版本可能会为您提供更多功能,但原始库是围绕数据并行构建的for原语。一般来说,OpenMP 和其他数据并行编程模型尝试抽象底层硬件,程序员将其计算声明为对数据的一系列操作,然后由 OMP 调度。

为了回答您的第一个问题,操作系统调度程序将跨内核调度线程,OMP 调度程序将跨可用线程调度工作。

#pragma omp parallel for
for (i = 0; i < N; i++)
    a[i] = 2 * i;

OMP 调度程序将根据许多因素(包括负载、分配给它的工作量以及您可能提供的任何提示)来选择要使用的核心(真实核心或超线程)。人们期望上面的代码能够在所有可用核心上运行(在您的示例中为 4 个)

您可以使用schedule关键字控制调度程序如何分配工作。

时间表(类型,块):如果工作共享结构是这样的话,这很有用 do 循环或 for 循环。工作共享结构中的迭代 根据定义的调度方法分配给线程 这个条款。三种类型的调度是:

static:在这里,所有 线程在执行循环之前被分配迭代 迭代。迭代在线程之间平均分配 默认。但是,为参数块指定一个整数将 将连续迭代的块数分配给特定线程。

dynamic:这里,一些迭代被分配给较小的迭代 线程数。一旦特定线程完成其分配的 迭代,它返回以从迭代中获取另一个迭代 左边。参数chunk定义了连续迭代的次数 一次分配给一个线程。

guided:一大块 连续的迭代被动态地分配给每个线程(如 多于)。块大小随着每个连续的指数而减小 分配到参数块中指定的最小大小

From 维基百科

回答你的第二个问题。您还可以使用num_threads属性指定要使用的线程数。在上面添加以下内容#pragma omp parallel for在该示例中,会将 OMP 限制为三个线程,无论是否有更多线程可用。

#pragma omp parallel num_threads(3)
#pragma omp for
for (i = 0; i < N; i++)
    a[i] = 2 * i;

还可以在某种程度上控制多处理器(多个插槽)系统中不同处理器之间的工作调度方式。OpenMP 和 NUMA 的关系?

您可能还会发现以下指南很有用,OpenMP 指南:C++ 的简单多线程编程.

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

使用 openMP 进行多核处理与多线程处理 的相关文章

  • 线程安全区域设置技术

    我们目前正在编写一个基于线程 python Web 服务器框架 cherrypy 的 Web 应用程序 并希望同时支持来自多个区域设置的用户 区域设置模块似乎不是线程安全的 是否有第三方库或模块以线程安全的方式提供区域设置解析和格式化功能
  • 在消费者循环中重用 unique_lock

    我在 Bjarne Stroustrup 的 C 编程语言 第 4 版 第 119 页中偶然发现了以下代码 queue
  • Winforms 多线程:每次在 UI 线程上调用方法时是否需要创建一个新的委托?

    我想调用一个在 UI 线程上操作控件的方法 我的代码可以运行并且我想优化 我指的是这个MSDN 上的资源 http msdn microsoft com en us library 757y83z4 28VS 71 29 aspx 根据那里
  • 在这种情况下,线程如何同时获取两个对象的锁?

    public void method Type1 inst1 Type2 inst2 synchronized inst1 synchronized inst2 do something now 从这段代码我可以理解 一旦线程进入该方法 它
  • C# 中的方法锁

    我有一堂课讲授这三种方法 该类被许多线程使用 如果 Method2 和 或 Method3 在任何线程中运行 我希望 Method1 等待 有什么建议么 public class Class1 public static void Meth
  • 查询Python的threading.Lock是否加锁

    我正在运行一个线程 下面的代码 它启动一个阻塞子进程 为了确保其他线程不会启动相同的子进程 我对此进行了锁定subprocess call称呼 我还希望能够终止这个子进程调用 所以我有一个从其他地方调用的停止函数 如果子进程提前停止 我也想
  • 从 Android 中的 Thread 更新 UI

    我想从更新进度条的线程更新我的用户界面 不幸的是 当从 可运行 更新进度条的可绘制对象时 进度条消失了 更改进度条的可绘制部分onCreate 另一边有效 有什么建议么 public void onCreate Bundle savedIn
  • 尝试在另一个线程wxpython中创建一个对话框

    我正在另一个线程中运行一个函数 该函数应该填写一个对话框 然后显示它 但只要我尝试以任何方式更改对话框 它就会出现段错误 我读到这是 WxPython 的一个常见问题 并且开发人员无意直接更改另一个线程中的对话框 我该如何解决这个问题 我可
  • boost::asio 和 boost::coroutine 使用模式有什么问题?

    In this https stackoverflow com questions 31610415 what causes a random crash in boostcoroutine我描述的问题增强 asio and 增强 协程使用
  • Pthreads PHP:并行执行 Foreach 循环

    如何将核心 PHP 代码转换为 Pthread 代码 我的核心 PHP 代码 require once xyz php count 0 foreach sites as site require once allsite site php
  • Java 有没有办法记录*每个*线程中断?

    我想每次都以某种方式记录Thread interrupt 被调用 记录哪个线程发出调用 及其当前堆栈 以及识别有关哪个线程被中断的信息 有没有办法做到这一点 在搜索信息时 我看到有人提到实施安全管理器的可能性 这是可以在运行时完成的事情 例
  • 使用 Rcpp 和 OpenMP 在 R 中实现多线程和 SIMD 矢量化 Mandelbrot

    As an OpenMP Rcpp性能测试 我想检查使用最直接和最简单的方法在 R 中计算 Mandelbrot 集的速度有多快Rcpp OpenMP执行 目前我所做的是 include
  • Linux 内核 - 如何停止等待信号量的 kthread?

    在编写 Linux 内核模块时 我遇到了一个 kthread 问题 在等待信号量解锁时无法唤醒该 kthread 这会导致线程不可停止并且rmmod尝试卸载模块时冻结 请注意 该模块在 3 10 内核上运行 我无法将其更新到较新的版本 客户
  • 流行的“易失性轮询标志”模式被打破了吗?

    假设我想使用布尔状态标志来进行线程之间的协作取消 我意识到人们最好应该使用CancellationTokenSource反而 这不是这个问题的重点 private volatile bool stopping public void Sta
  • 快速变化的集合 MVVM WPF - 高 CPU 使用率和 UI 几乎冻结

    我正在开发一个带有数据网格的应用程序 它显示某些正在运行的 Windows 进程 在我的示例 Chrome 进程中 当选中复选框时 数据网格会加载进程 要求 显示每个进程的名称 内存使用情况 私有工作集 的 实时 信息 就像在 Window
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 使用 OpenMP 并行嵌套循环运行缓慢

    我有一个 fortran 程序的一部分 其中包含一些嵌套循环 我想将其与 OpenMP 并行化 integer nstates N i dima dimb dimc a row b row b col c row row col doubl
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • 多线程:您在什么时候创建了太多线程?

    我正在开发一个多线程应用程序 该应用程序最初是单线程 后来扩展到多线程以实现性能提升 我有一个主线程 它将工作分成更小的块 并将其卸载到处理这些块的工作线程 此部分使用信号量进行控制 以在任何时间仅允许 X 个工作线程 工作线程生成数据块

随机推荐

  • 在 R 中获取每年 11 月的第四个星期三

    我有一个时间索引矩阵 xts 对象 我只想要每年 11 月的第四个星期三 require quantmod getSymbols GSPC from 1900 01 01 returns GSPC GSPC WED lt weekdays
  • 拖动一张图像会拖动另一张图像

    当我拖动上传图片的右侧部分在 mask1 中 比 mask2 中上传的图像正在拖动 但这不应该发生 Here is 视频链接 另外 如果我仅在蒙版 1 中上传图像并尝试拖动 图像将会消失 但如果我在两个蒙版中上传图像 则图像不会消失 视频链
  • 获取快捷方式文件夹的目标

    如何获取快捷方式文件夹的目录目标 我到处搜索 只找到快捷方式文件的目标 我认为您需要使用 COM 并添加对 Microsoft Shell Control And Automation 的引用 如中所述这篇博文 这是使用此处提供的代码的示例
  • 如何从C调用C++编写的lib?

    在我看来 这似乎是理所当然的事情 但我找不到任何反对或支持它的信息 从 demangle 等角度来看 我不认为这是一个大问题 但我无法弄清楚 如何编写一个小型 C 程序来调用一个小型 C 库中的函数 我现在在linux上 尝试静态绑定 这肯
  • MSBuild 脚本和 VS2010 发布应用 Web.config 转换

    因此 我已经安装了 VS 2010 并且正在为 TeamCity 构建集成修改 MSBuild 脚本 除了一个例外 一切都运行良好 我如何告诉 MSBuild 我想要应用发布构建时创建的 Web config 转换文件 我有以下内容 可以生
  • 如何使用 Plotly-Dash 调整滑块和选择器的范围

    我正在尝试重新创建这个 Plotlyexample使用 Dash 但我无法获取按钮和范围滑块 有谁知道我该怎么做 这就是我尝试过的 traces x df index y df level type scatter mode lines n
  • 自定义委托

    我想知道如何使用自定义委托 也许一个例子会对您有所帮助 import
  • 在不以科学记数法显示的情况下,JavaScript 数字可以有多小?

    我编写了一些代码 将数字四舍五入到给定的小数位数 但在出现下溢时会使用更多位 以避免四舍五入到零 这对用户来说信息量不够 但我注意到偶尔会有一小部分数字以科学计数法显示 我的目标用户预计不会适应科学记数法 无论如何 即使在处理下溢之后 这些
  • 开发模式下Rails自动重载插件

    我试图拥有一个插件 每次更改代码时我都会开发自动重新加载 模拟 Rail 开发模式中通常发生的相同自动重新加载 我的插件主要是一个 ActiveRecord mixin 模块 我已经尝试了在相关谷歌搜索中找到的所有建议 还没有任何效果 在我
  • Eclipse ADT 插件 - 图形布局工具滞后并占用内存

    Win7 64位 12GB内存 i7 ADT v 16 01 我的图形布局工具表现得很奇怪 每次我进行单个更改时 布局上方的工具按钮都会闪烁 并且它会 工作 大约 10 秒 直到最终完成更改 在此过程中 javaw exe 对于我执行的每个
  • 如何更改 Qt 上标题(水平/垂直)QTableWidget 的背景颜色?

    我想知道如何更改对象标题 水平 垂直 的背景颜色QTableWidget on Qt 我已经知道如何使用以下方法一起更改所有标题 ui gt tableWidget gt setStyleSheet QHeaderView section
  • 收到致命警报:handshake_failure

    我正在尝试使用以下方式向我的设备发送推送通知javapns图书馆在liferay 这是代码 private void pushNotification ActionRequest actionRequest ActionResponse a
  • 正则表达式替换电子邮件地址域?

    我需要一个正则表达式来混淆我拥有的数据库转储文件中的电子邮件 我想用一组域替换所有域 例如 fake com所以我不会冒险在开发过程中向真实的人发送电子邮件 电子邮件必须是唯一的才能匹配数据库限制 因此我只想替换域名并保留用户名 我目前有这
  • 如何添加“再玩一次”? java 的功能

    我正在为我的班级制作一个猜谜游戏 当您猜到正确的数字时 我需要一些帮助来在游戏结束时添加 再玩一次 功能 public class GuessingGame public static void main String args Scann
  • 插入转义字符

    我想用转义字符值替换并插入转义字符序列 同时考虑到 会使转义字符无效 例如 This is a n test Here is a n which represents a newline 在 Ruby 中实现这一目标的最简单方法是什么 我假
  • 为什么聚焦时 QLineEdit 样式不改变?

    我正在使用 Qt 及其样式表开发 GUI 在主窗口样式表上 我放置了以下样式 QLineEdit focus border 2px solid 006080 但当我使用它时 风格并没有像我预期的那样真正改变 但是 如果我将相同的样式表直接放
  • 将命令输出保存到变量

    在批处理文件中 我尝试获取命令的输出并将其保存到变量中 我的命令的目标是计算某个文件夹中的文件夹数量 我无法使用中提供的技巧this接受答案 因为我必须这样做cd path to my folder进入当前目录 不幸的是 我无法执行此命令
  • 如何判断 ALL_TAB_COLS 中哪些列未使用?

    当您在 Oracle 9i 上查询 ALL TAB COLS 视图时 它会列出标记为 UNUSED 的列以及 活动 表列 似乎没有一个字段明确说明某列是否未使用 也没有我可以加入的任何视图列出表中未使用的列 如何轻松找出哪些是未使用的列 以
  • 如何从给定的子键中查找数组的所有父键?

    假设我有以下嵌套 多维数组 array World gt array Asia gt array Japan gt array City gt Tokyo 我希望能够找到当前城市层次结构中的所有父母 例如 对于城市 响应应该是包含以下内容的
  • 使用 openMP 进行多核处理与多线程处理

    这个问题听起来可能很基本 但是我找不到任何具体的答案 现在假设我们有一个多核处理器 例如 corei5 680 2 个物理核心和支持 HT 的 4 个操作系统可用核心 我的问题是 openMP 到底适合什么情况 1 当我们说使用 openM