英特尔编译器 (C++) 在 std::vector 上减少 OpenMP 问题

2023-11-25

从OpenMP 4.0开始,支持用户定义的缩减。所以我在 C++ 中准确地定义了 std::vector 的减少here。它在 GNU/5.4.0 和 GNU/6.4.0 上运行良好,但在 intel/2018.1.163 上它会返回随机值以进行减少。

这是例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include "omp.h"

#pragma omp declare reduction(vec_double_plus : std::vector<double> : \
                              std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<double>())) \
                    initializer(omp_priv = omp_orig)

int main() {

    omp_set_num_threads(4);
    int size = 100;
    std::vector<double> w(size,0);

#pragma omp parallel for reduction(vec_double_plus:w)
    for (int i = 0; i < 4; ++i)
        for (int j = 0; j < w.size(); ++j)
            w[j] += 1;

    for(auto i:w)
        if(i != 4)
            std::cout << i << std::endl;

    return 0;
}

每个线程将所有 w 条目(其本地 w)加 1,最后将所有条目加到一起(归约)。所有 w 条目的结果在 GNU 中都是 4,但在 intel 编译器中是随机的。有谁知道这里发生了什么吗?


这似乎是 Intel 编译器中的一个错误,我可以使用不涉及向量的 C 示例可靠地重现它:

#include <stdio.h>

void my_sum_fun(int* outp, int* inp) {
    printf("%d @ %p += %d @ %p\n", *outp, outp, *inp, inp);
    *outp = *outp + *inp;
}

int my_init(int* orig) {
    printf("orig: %d @ %p\n", *orig, orig);
    return *orig;
}

#pragma omp declare reduction(my_sum : int : my_sum_fun(&omp_out, &omp_in) initializer(omp_priv = my_init(&omp_orig))

int main()
{   
    int s = 0;
    #pragma omp parallel for reduction(my_sum : s)
    for (int i = 0; i < 2; i++)
        s+= 1;

    printf("sum: %d\n", s);
}

Output:

orig: 0 @ 0x7ffee43ccc80
0 @ 0x7ffee43ccc80 += 1 @ 0x7ffee43cc780
orig: 1 @ 0x7ffee43ccc80
1 @ 0x7ffee43ccc80 += 2 @ 0x2b56d095ca80
sum: 3

它将归约运算应用于原始变量before从原始值初始化私有副本。这会导致错误的结果。

您可以手动添加障碍作为解决方法:

#pragma omp parallel reduction(vec_double_plus : w)
{
  #pragma omp for
  for (int i = 0; i < 4; ++i)
    for (int j = 0; j < w.size(); ++j)
      w[j] += 1;
  #pragma omp barrier
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英特尔编译器 (C++) 在 std::vector 上减少 OpenMP 问题 的相关文章

  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

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

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • 编译器是否对异步方法链执行“返回值优化”

    不是传统意义上的返回值优化 但我想知道你什么时候会遇到这样的情况 private async Task Method1 await Method2 private async Task Method2 await Method3 priva
  • Objective-C 类参考:符号未找到错误

    我已经在这个 iPhone 应用程序上工作了一段时间了 我已经完全完成并可以使用它了 我正在扩展的项目是从在线颠覆存储库下载的 我的教授也给了我访问权限 我不小心没有下载 根 副本或类似的东西 所以我无法向存储库提交任何更改 在老师的帮助下
  • 为什么 stddef.h 不在 /usr/include 中?

    我已经编译了gnu标准库并将其安装在 GLIBC INST 现在 我尝试编译一个very简单的程序 仅使用一个 include include
  • 如何通过切片符号 a[::-1] 解释序列的反转

    来自python org 教程 切片索引有有用的默认值 省略的第一个索引默认为零 省略的第二个索引默认为被切片的字符串的大小 gt gt gt a hello gt gt gt print a 1 olleh 正如教程所说a 1 应该等于a
  • 将变量从 PHP 导出到 shell

    我正在尝试设置一个可以从 PHP 外部访问的变量 理想情况下 这应该是局部变量 但也欢迎环境变量 首先 我尝试过putenv 但这没有给出结果 php r putenv PHP TEST string 回显 PHP TEST 当我打电话时g
  • Altair 中 mark_text 的格式文本

    我正在尝试创建一个类似于以下内容的图表多行工具提示示例 但我想格式化正在打印的字符串 以便在末尾添加一些文本 我正在尝试修改这部分 Draw text labels near the points and highlight based o
  • 用于分割嵌套坐标字符串的正则表达式

    我有一个格式的字符串 1 2 2 3 3 4 具有任意数量的元素 我试图将它拆分为分隔坐标的逗号 即检索 1 2 2 3 and 3 4 我可以用Java正则表达式来做吗 我是一个十足的菜鸟 但希望 Java 正则表达式足够强大 如果不是
  • WebSphere 7. 从另一个应用程序注入 EJB

    我正在尝试使用 EJB 注释注入 EJB 当我将一个 EJB 注入同一只耳朵中的另一个 EJB 时 它工作正常 当我从同一耳朵的另一只耳朵将一个 EJB 注入另一个 EJB 时 服务器我得到一个异常 EJB 在调用期间抛出意外的 未声明的
  • 如何确定网络服务器运行的是 Linux 还是 Windows? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我被要求查明某个特定站点是否运行 Windows 或 Linux 作为其网络服务器 通常我们可以访问 我只需上传一个 phpinfo 文件 这将为我提供所需的所有相关信息 但是我们
  • 适用于 Java 的 Eclipse IDE - 全深色主题

    有什么办法可以让Eclipse彻底变成黑暗IDE吗 这是一个Picture我要问的 我不介意花 1 小时的时间来做这样的事情 D EDIT As Konstantin Komissarchik said I had to modify my
  • 为 Actionbar SearchView 创建异步 ContentProvider

    我的 ActionBar 中有一个 SearchView 它与 ContentProvider 连接以提供搜索建议 这些建议并非来自数据库 与通常的 ContentProvider 一样 而是来自 Web 服务 这就是为什么我必须异步处理
  • 如何在 IIS7 中使用 gzip 压缩?

    我已经为IIS7安装了静态和动态压缩 并设置了这两个web config我的应用程序的值Virtual Folder等级 据我了解 我不再需要在服务器或站点级别启用压缩 并且我可以使用 web config 文件按文件夹进行管理 我的里面有
  • JavaScript 数组:获取项目的“范围”

    是否有与 ruby 相当的东西array n m 在 JavaScript 中 例如 gt gt a a b c d e f g gt gt a 0 2 gt a b c Use the array slice begin end 功能 v
  • 另一个组件中的 MVC 6 RC2 控制器

    在 MVC 6 RC1 中我们使用了IAssemlbyProvider接口来注册在运行时发现的程序集并注入其他控制器类型 以类似的方式时尚到这篇文章 现在随着 RC2 的发布IAssemblyProvider已被删除并更改为 见参考资料 目
  • 为函数的参数分配默认值的困难

    在一个类中 我定义了一个私有常量 我尝试使用该常量作为函数参数的默认值 class Foo instance variable private let DefaultValue 10 Compiler error Cannot use in
  • 将android logcat数据写入文件

    每当用户想要收集日志时 我想将 Android logcat 转储到文件中 通过 adb 工具 我们可以使用以下命令将日志重定向到文件adb logcat f filename 但是我如何以编程方式执行此操作 这是一个example读取日志
  • Collections.defaultdict 与普通 dict 的区别

    我已经阅读了 python 文档中的示例 但仍然无法弄清楚这个方法的含义 有人可以帮忙吗 这是 python 文档中的两个示例 gt gt gt from collections import defaultdict gt gt gt s
  • 使用 Java 进行 ElasticSearch 聚合

    我想在我的 java 应用程序中进行聚合 首先 我使用curl 构建了REST 查询 它看起来像 curl XGET localhost 9200 analysis search pretty H Content Type applicat
  • 根据设备(iPhone 或 iPad)不同的设备方向

    我正在开发一个具有以下要求的通用项目 对于 iPhone 我只想要纵向 对于 iPad 仅限风景 我该怎么做iOS 8 迅速 在我看来 按照 ScarletMerlin 的建议 更改 info plist 中的键是满足我必须满足的要求 每种
  • 英特尔编译器 (C++) 在 std::vector 上减少 OpenMP 问题

    从OpenMP 4 0开始 支持用户定义的缩减 所以我在 C 中准确地定义了 std vector 的减少here 它在 GNU 5 4 0 和 GNU 6 4 0 上运行良好 但在 intel 2018 1 163 上它会返回随机值以进行