OpenMP 并行减少会产生错误的结果

2024-01-29

我正在使用信号矩阵,我的目标是计算一行所有元素的总和。该矩阵由以下结构表示:

typedef struct matrix {
  float *data;
  int rows;
  int cols;
  int leading_dim;
} matrix;

我不得不提到矩阵是按列优先顺序存储的(http://en.wikipedia.org/wiki/Row-major_order#Column-major_order http://en.wikipedia.org/wiki/Row-major_order#Column-major_order),这应该解释这个公式column * tan_hd.rows + row用于检索正确的索引。

for(int row = 0; row < tan_hd.rows; row++) {
    float sum = 0.0;
    #pragma omp parallel for reduction(+:sum)
    for(int column = 0; column < tan_hd.cols; column++) {
        sum += tan_hd.data[column * tan_hd.rows + row];
    }
    printf("row %d: %f", row, sum);
}

如果没有 OpenMP 编译指示,交付的结果是正确的,如下所示:

row 0: 8172539.500000 row 1: 8194582.000000 

一旦我添加#pragma omp...如上所述,返回不同(错误)的结果:

row 0: 8085544.000000 row 1: 8107186.000000

以我的理解,reduction(+:sum)创建私人副本sum对于每个线程,完成循环后,这些部分结果将被求和并写回全局变量sum再次。我做错了什么?

我很感激你的建议!


Use the 卡汉求和算法 http://en.wikipedia.org/wiki/Kahan_summation_algorithm

  • 它具有与朴素求和相同的算法复杂性
  • 它将大大提高求和的准确性,而无需将数据类型切换为双倍。

通过重写代码来实现它:

for(int row = 0; row < tan_hd.rows; row++) {
    float sum = 0.0, c = 0.0;
    #pragma omp parallel for reduction(+:sum, +:c)
    for(int column = 0; column < tan_hd.cols; column++) {
        float y = tan_hd.data[column * tan_hd.rows + row] - c;
        float t = sum + y;
        c = (t - sum) - y;
        sum = t;
    }
    sum = sum - c;
    printf("row %d: %f", row, sum);
}

您还可以切换所有float to double达到更高的精度,但由于你的数组是float数组中,应该只存在末尾有效数字的数量差异。

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

OpenMP 并行减少会产生错误的结果 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • Perl Parallel::Forkmanager 不允许收集变量值

    也许因为子进程不知道我的散列 请参阅下面的代码 散列 输出没有收集任何内容 除了写入 tmp 文件之外 还有其他方法来收集该值吗 foreach Item AllItems pid pm gt start Item and next Tem
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include

随机推荐

  • java jprogressbar 在繁重操作期间挂起

    我正在编写一个 java 程序 在调用大量使用 CPU 的方法之前 我会显示一个带有 JProgressBar 的框架 虽然我在调用方法之前显示它 但直到方法结束才显示 JProgressBar 进度条 还 没有以任何方式与该方法交互 这就
  • 如何将汉字一一拆分?

    如果没有特殊字符 如空白 等 在名字和姓氏之间 那么下面如何拆分汉字呢 use strict use warnings use Data Dumper my fh DATA my fname 小三 my lname 张 while my n
  • 监控浏览器控制台中的所有 JavaScript 事件

    是否可以监听所有的javascript事件 我试图猜测 AJAX 请求修改 DOM 后是否会触发事件 With firebug http getfirebug com wiki index php Command Line API moni
  • Git 恢复未按预期工作

    我遇到了问题git revert命令 我使用 Ubuntu 12 04 Linux 和 Git 版本 1 7 9 5 我创建了一个全新的b test repo在我的本地电脑上 从远程跟踪它origin b test repo 我在本地创建了
  • 在 C# 中创建部分(或有界)FileStream

    我有一个 FileStream 它由放入一个文件中的多个文件组成 并且我有一个文件长度的列表 换句话说 我可以轻松计算所有文件的位置和长度 我想要创建的是一个 Open 方法 它接受文件索引并返回仅包含该文件的流 目前我已经使用内存流实现了
  • 如何从maven pom文件构建项目

    我有一个开源项目的 Maven pom 文件 这个pom文件包含所有信息 比如它所依赖的其他jar等 我安装了maven 创建一个 samprj 目录并将 pom 文件复制到该目录中 cd 进入该目录并运行 mvn 命令而不带任何参数 但我
  • 什么是 git 边界提交

    The git log command https git scm com docs git log has a boundary选项 这会导致程序 输出排除的边界提交 但什么是边界提交 我什么时候可以将它们包含在输出中 边界提交是限制修订
  • 为什么我们需要 onUpgrade(); SQLiteOpenHelper 类中的方法

    我正在关注这个教程 http www androidhive info 2011 11 android sqlite database tutorial http www androidhive info 2011 11 android s
  • Excel 宏第一次工作,然后下次就很慢

    因此 在未共享的工作表中运行我的宏时 它工作得很好 没有任何问题 只要我共享它 通常第一次就会运行良好 但第二次需要永远运行 如果我第一次运行宏后关闭工作簿并重新打开它将再次运行良好 我尝试清除剪贴板 还尝试了使用宏清除剪贴板的另一个版本
  • dax 中选取不同值的动态总和

    以下是样本数据 Week Practice Type capacity Gen 1 BI c 80 0 1 BI c 80 1 1 BI sc 160 1 1 BI pc 240 0 1 BI pc 240 3 1 BI mc 1160 1
  • 如何在 pandas 中填充直到一天结束?

    我有一个pandas TimeSeries与日内指数 如何分别填充 前向填充 每天的 NaN 值 以这个系列为例 2013 03 27 22 07 00 04 00 1 0 2013 03 27 22 08 00 04 00 nan 201
  • 当我们从 Fragment 类调用 facebook 或 twitter 时如何处理后退按钮?

    我想从 Fragment 连接 Facebook 和 Twitter 但是当我从 Facebook 或 Twitter 返回时 应用程序已关闭 我想留在该应用程序中 我的代码在这里 Override public View onCreate
  • Java:将光标保持在某个区域

    对于玩过 Madness Interactive 的人来说 最令人沮丧的事情之一就是当光标离开游戏区域时 您不小心点击了 这会导致游戏失焦 你的角色会在几秒钟内死亡 为了解决这个问题 我想制作一个可以在后台运行的java应用程序 它将光标保
  • Tkinter 在 Windows XP 上激活窗口

    我有一个小型 GUI 应用程序 用于侦听网络消息 以便用户可以更新一些信息并接受它 这是在生产工厂环境中 用于与特定的物理硬件交互 在某些情况下通过串行 工作流程如下所示 用户正在与另一个程序交互 5250 绿屏 他们输入特定的键绑定 将
  • 来自位图源的图像的 LazyColumn 闪烁/闪烁

    我是 Jetpack Compose 的新手 我目前正在开发一个聊天应用程序 我要求用户从图库中选择图像或从相机中拍照 然后我将文件 Uri 保存到数据库中 然后监听所有消息的列表 当此列表更新时 此图像正在重新组合并闪烁 视图模型中的消息
  • 我的 PHP 脚本缓存(公共)友好吗?

    我已经完成了一个可以提供许多文档的小型 PHP 应用程序 这些文件must可由客户端缓存and代理 由于代理可以缓存我的结果 因此我必须格外小心 因为我提供的文档可以具有不同的 MIME 类型 基于 SERVER HTTP ACCEPT 的
  • arm-none-eabi 和 arm-linux-gnueabi 之间的区别?

    arm none eabi 和 arm linux gnueabi 有什么区别 我知道如何使用它们的区别 一种用于裸机软件 另一种用于在 Linux 上运行的软件 但技术背景是什么 我发现 ABI 存在差异 据我所知 它类似于 API 但在
  • Jquery mousedown 与 click

    今天我发现了一些让我很困惑的事情 我只是试图通过 jquery 隐藏 s th 首先我尝试使用这个 specificdiv li nth child 3 click function anotherdiv hide 但它不起作用 一段时间后
  • 使用 GIT 部署代码 - 签出与重置 -- 难吗?

    我需要确保服务器上的 python 部署位置之一始终与远程分支同步 并删除服务器上的任何更改 选项 1 和选项 2 有什么区别 哪一个是首选 我打算及时运行它 以确保服务器代码与远程同步 选项1 git clean f x git fetc
  • OpenMP 并行减少会产生错误的结果

    我正在使用信号矩阵 我的目标是计算一行所有元素的总和 该矩阵由以下结构表示 typedef struct matrix float data int rows int cols int leading dim matrix 我不得不提到矩阵