嵌套循环、内循环并行化、重用线程

2024-03-17

免责声明:以下示例只是一个快速理解问题的虚拟示例。如果您正在考虑现实世界的问题,请考虑任何动态编程。

问题:我们有一个 n*m 矩阵,我们想要复制前一行的元素,如以下代码所示:

for (i = 1; i < n; i++)
    for (j = 0; j < m; j++)
        x[i][j] = x[i-1][j];

方法:外循环迭代必须按顺序执行,它们将按顺序执行。 内循环可以并行化。我们希望最大限度地减少创建和终止线程的开销,因此我们希望只创建一次线程组,但是,这在 OpenMP 中似乎是一项不可能完成的任务。

#pragma omp parallel private(j)
{
   for (i = 1; i < n; i++)
   {   
      #pragma omp for scheduled(dynamic)
      for (j = 0; j < m; j++)
         x[i][j] = x[i-1][j];
   }
}

当我们申请时ordered外循环上的选项,代码将以顺序方式执行,因此不会有性能增益。 我正在寻找上述场景的解决方案,即使我不得不使用一些解决方法。

我正在添加我的实际代码。这实际上比 seq 慢。版本。请查阅:

/* load input */
for (i = 1; i <= n; i++)
    scanf ("%d %d", &in[i][W], &in[i][V]);

/* init */
for (i = 0; i <= wc; i++)
    a[0][i] = 0;

/* compute */
#pragma omp parallel private(i,w)
{
    for(i = 1; i <= n; ++i) // 1 000 000
    {
        j=i%2;
        jn = j == 1 ? 0 : 1;

        #pragma omp for
        for(w = 0; w <= in[i][W]; w++) // 1000
            a[j][w] = a[jn][w];

        #pragma omp for
        for(w = in[i][W]+1; w <= wc; w++) // 350 000
            a[j][w] = max(a[jn][w], in[i][V] + a[jn][w-in[i][W]]);
    }
}

至于测量,我正在使用这样的东西:

double t;
t = omp_get_wtime();
// ...
t = omp_get_wtime() - t;

总结一下 OpenMP 中针对这种特殊情况的并行化:不值得。

Why?内循环的操作很简单。代码编译为-O3, so max()call 可能被函数体的代码替换。 隐式屏障的开销可能足够高,以补偿性能增益,并且总体开销足够高,使得并行代码甚至比顺序代码更慢。 我还发现,这种构造没有真正的性能提升:

#pragma omp parallel private(i,j)
{ 
   for (i = 1; i < n; i++)
   {   
      #pragma omp for
      for (j = 0; j < m; j++)
         x[i][j] = x[i-1][j];
   }
}

因为它的性能和这个类似

for (i = 1; i < n; i++)
{   
   #pragma omp parallel for private(j)
   for (j = 0; j < m; j++)
      x[i][j] = x[i-1][j];
}

感谢 GCC 中的内置线程重用libgomp,根据这篇文章:http://bisqwit.iki.fi/story/howto/openmp/ http://bisqwit.iki.fi/story/howto/openmp/

由于外循环无法并行化(没有ordered选项)看起来没有办法使用 OpenMP 显着提高相关程序的性能。如果有人觉得我做错了什么,而且这是可能的,我会很高兴看到并测试解决方案。

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

嵌套循环、内循环并行化、重用线程 的相关文章

随机推荐

  • d3js 在饼图周围重新分布标签

    我正在使用 d3 js 创建一个外部带有标签的圆环图 我使用基于饼图每片质心的三角函数来定位标签 g append g attr class percentage append text attr transform function d
  • 持久 Akka 邮箱和无损

    在 Akka 中 当一个 actor 在处理消息时死亡 内部onReceive 该消息丢失 有没有办法保证无损 有没有办法配置 Akka 始终保留消息before将他们发送到onReceive 以便在演员死亡时可以恢复并重播 也许像持久邮箱
  • 我应该如何在 Angular 模块中包含模型类?

    我有几个类 我想成为一个普通的 bean DTO 类 它们不显示 component 类 它们不是 Pipe 类 也不应该是 Directive 至少我认为不应该 是 我希望能够将它们捆绑到一个模块中 它们将在其他模块中使用 但尽管有几个咒
  • scala string.split 不起作用

    以下是我的 REPL 输出 我不确定为什么 string split 在这里不起作用 val s Pedro groceries apple 1 42 s java lang String Pedro groceries apple 1 4
  • 根据用户输入更改 AppID 和 AppName

    我想在同一系统上多次安装同一应用程序 例如两个用户使用两个不同的 Web 服务 每个都有自己的 在我的设置脚本中我想更改AppID and AppName基于用户的输入 例如我的默认值AppName Service App 应该改为AppN
  • 如何使用Vault在Ansible v2中运行playbook api

    这是我所拥有的 我知道这无需加密即可运行 并且我可以运行 ansible vault 编辑 common yml with ANSIBLE VAULT PASSWORD FILE vault pass txt 在环境中设置 from col
  • Gerrit 可以在 Gitlab 之前工作吗?还是打算取代它

    我认为我并没有真正理解 Gerrit 如何融入我团队现有的工作流程 Gerrit 是否打算成为代码的中心 枢纽 我一直把它想象成类似于 Atlassian 的 Crucible 它适合 Atlassian 的 Stash 或 Bitbuck
  • C# 反应式扩展 当 OnNext 花费很长时间并且可观察到产生新事件时会发生什么

    我是 Rx 新手 我在想当 IObservable 非常快地产生大量事件而 OnNext 需要很长时间时会发生什么 我猜想新事件会在内部以某种方式排队 这样我就可以运行我们的内存 我对吗 考虑下面的小例子 Subject
  • 如何对 json 数组值进行排序?

    我想将此 json 转换为按日期排序的 html 表 基本上我的 JSON 数据看起来像这样 这里我要recurrence列出日期 var frequencyList project abc recurrenceList 2021 09 1
  • IBrokers reqMktData,如何在回调函数中添加超时?

    我一直在使用来自 IBrokers 软件包的修改后的快照功能来从 IB 获取 最后 价格 并且它对于流动性股票非常有效 我打的电话是例如 reqMktData tws twsSTK AAPL eventWrapper eWrapper da
  • Ansible/Jinja2 - 映射列表中的嵌套键

    当映射嵌套变量列表中的属性时 我无法检索其键 我想从下面检索 tls cert file 的密钥强调文字变量 vault config listener tcp address 0 0 0 0 8200 tls cert file etc
  • JS 线性变换和矩阵乘法失败

    我正在学习线性代数并尝试制作一个具有基本线性变换的小程序 旋转 缩放 平移 这是完整的工作示例 我编写了用于为每个变换生成每个矩阵的函数以及用于计算它们的函数 矩阵与点相乘 矩阵相乘 export const multiplyMatrixW
  • 当我为rabbitmq-management创建用户时,发生了错误

    当我为rabbitmq创建用户时 root localhost rabbitmqctl add user admin admin 发生错误 消息 Creating user admin Error undef crypto hash sha
  • Yocto 构建上的 JAVA 安装错误

    我在 Poky Linux 系统上安装 Java 时遇到了很多麻烦 我正在使用 Yocto 构建我的系统 配置如下 本地配置文件 MACHINE intel corei7 64 DISTRO poky PACKAGE CLASSES pac
  • emberjs 文档就绪函数应该放在哪里?

    我正在尝试附加一个预先输入 https github com twitter typeahead js 到我的模板之一中的文本输入 因为 Ember 使用把手 所以 jQuery 的文档就绪函数不是用于预输入定义的地方 放置 模板就绪 代码
  • vim + iterm:如何使用鼠标执行除选择之外的所有操作?

    好的 有一个非常具体的设置问题 我使用的是 Mac OS X iTerm 和 vim 我真的很喜欢使用鼠标在正常模式下单击选项卡 在正常模式下滚动等 例如 我鼠标已经可以工作了在 iTerm vim 中 但是 我不喜欢使用视觉模式进行选择
  • 在构建期间将 Visual Studio 项目文件复制到输出目录

    当我生成 Visual Studio 项目时 可执行文件将写入项目属性页中指定的输出目录 我有一个包含一些额外文件的项目 例如 ini文件 由程序使用 如何配置项目以将文件复制到输出目录 以便当程序运行时 它的 CWD 中有另一个文件的副本
  • 优化 Node.js 内存消耗

    我正在用 Node js Express 和 MongoDB 编写一个简单的 cms 我计划为每个站点运行不同的 Node js 进程 问题是启动后该进程需要大约 90m 的 RAM 对我来说太大了 8 个站点占用了所有服务器 RAM 该内
  • 删除从另一个指针分配的指针,我应该再次删除另一个指针吗?

    所以 这是我的例子来解释这个问题 void p1 int p2 p3 p2 new int p1 p2 p3 int p1 要释放内存 以下 3 行是否彼此等效 delete p2 delete p3 delete int p1 我使用这样
  • 嵌套循环、内循环并行化、重用线程

    免责声明 以下示例只是一个快速理解问题的虚拟示例 如果您正在考虑现实世界的问题 请考虑任何动态编程 问题 我们有一个 n m 矩阵 我们想要复制前一行的元素 如以下代码所示 for i 1 i lt n i for j 0 j lt m j