OpenMP 中 private 子句中的变量与并行区域中定义的变量之间有什么区别吗?

2023-11-24

我想知道是否有任何理由选择private(var)OpenMP 中关于(私有)变量本地定义的子句,即

int var;
#pragma omp parallel private(var)
{
    ...
}

vs.

#pragma omp parallel
{
    int var;
    ...
}

另外,我想知道私人条款有什么意义。这个问题在中得到了部分解释OpenMP:局部变量自动私有吗?,但我不喜欢这个答案,因为即使 C89 也不禁止您在函数中间定义变量,只要它们位于作用域的开头(当您进入并行区域时,自动会出现这种情况)。因此,即使对于老式 C 程序员来说,这也不会有任何区别。 我是否应该将其视为语法糖,允许使用过去美好时光中使用的“在函数开头定义变量”样式?

顺便说一句:在我看来,第二个版本还阻止程序员在并行区域之后使用私有变量,希望它可以包含有用的东西,因此私有子句的另一个 -1 。

但由于我对 OpenMP 还很陌生,所以在没有很好的解释的情况下我不想提出任何问题。预先感谢您的回答!


它不仅仅是语法糖。 OpenMP 所追求的特性之一是,如果代码不是用 OpenMP 编译的,则不会更改串行代码。如果您不使用 OpenMP 进行编译,则用作编译指示一部分的任何构造都会被忽略。这样做你可以使用类似的东西private, firstprivaate, collapse, and parallel for无需更改您的代码。更改代码可能会影响编译器优化代码的方式等。

如果你有类似的代码

int i,j;
#pragma omp parallel for private(j)
for(i = 0; i < n; i++) {
      for(j = 0; j < n; j++) {
   }
}

做到这一点的唯一方法,无需private in C89就是通过定义来改变代码j在平行部分内,例如:

int i,j;
#pragma omp parallel
{
    int j;
    #pragma omp for
    for(i = 0; i < n; i++) {
           for(j = 0; j < n; j++) {
        }
    }
}

这是一个 C++ 示例firstprivate。假设您有一个想要保密的向量。如果你使用firstprivate您不必更改代码,但如果您在并行区域内声明私有副本,则需要更改代码。如果您在没有 OpenMP 的情况下对其进行编译,则会生成不必要的副本。

vector<int> a;
#pragma omp parallel {
    vector<int> a_private = a;
}

这种逻辑适用于许多其他结构。例如collapse。您可以手动融合一个循环来更改您的代码,或者您可以使用collapse并且仅在使用 OpenMP 编译时融合它。

然而,话虽如此,在实践中,我经常发现无论如何我都需要更改代码才能获得最佳并行结果,因此我通常在并行部分中定义所有内容,并且不使用诸如private, firstprivate, or collapse(更不用说 OpenMP 在 C++ 中的实现经常遇到困难反正非 POD所以通常最好自己做)。

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

OpenMP 中 private 子句中的变量与并行区域中定义的变量之间有什么区别吗? 的相关文章

随机推荐

  • 使用 AJAX 通过 Flask-WTForms 将条目附加到 FieldList

    我使用 Flask WTForms 在 Flask 中制作了一个简单的表单 家长可以在其中注册自己和他的孩子 家长可以通过单击 添加孩子 按钮来注册任意数量的孩子 WTForms 通过使用 FieldList 功能使这变得非常容易实现 但是
  • LOAD DATA INFILE 轻松将 YYYYMMDD 转换为 YYYY-MM-DD?

    您好 我想导入一个 INFILE 但日期的形式为 AADR 20120403 31 43 31 43 31 4 31 4 1100 AAU 20120403 2 64 2 65 2 56 2 65 85700 AAVX 20120403 1
  • 将 mutate_at 有条件地应用于 R 中数据帧中的特定行

    我在 R 中有一个数据框 如下所示 a b c condition 1 4 2 acap 2 3 1 acap 2 4 3 acap 5 6 8 ncap 5 7 6 ncap 8 7 6 ncap 我正在尝试重新编码条件 ncap 的 a
  • C++:在二叉树中插入节点的指针与指针的指针

    我正在创建一个函数来在二叉树中插入一个元素 首先 我在 Visual Studio 2012 上执行了以下操作 void Insert Nodo root int x if root NULL Nodo n new Nodo n gt va
  • 使用 redux useDispatch 时 useEffect 缺少依赖项

    每当使用反应钩子安装我的组件时 我想获取我的类别useEffect而不是在每次重新渲染时 但我不断收到此警告React Hook useEffect has a missing dependency dispatch 这是我的代码 cons
  • Worksheet 类的 ShowAllData 方法失败

    我注意到当自动过滤器已打开时我的 VBA 脚本不起作用 知道这是为什么吗 wbk Activate Set Criteria Sheets Sheet1 Cells i 1 Set rng Sheets Sheet1 Range Cells
  • 如何在上传目录时删除 Chrome 中的警告消息

    使用上传目录时webkitdirectory在 Chrome 中 会出现一条丑陋的警告消息 该消息内容如下 将 数量 个文件上传到此站点 这将上传 目录名称 中的所有文件 仅当您信任该站点时才执行此操作 这是最近在 Chrome 版本 66
  • MSI 不在 C# 中运行

    我正在尝试运行一个MSI使用 Process Start 方法从 C 文件 MSI 文件很好 因为我可以正常运行它 但是当我尝试在某些 C 代码中运行 MSI 文件时 我收到以下错误 这个安装包无法 被打开 验证该包 存在 并且您可以访问它
  • java.lang.NumberFormatException用于将字符串转换为long [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我正在尝试将字符串转换为长字符串 它会抛出NumberFormatException 我不认为这超出了范围long at all 这是要转换的代码 其中count strng
  • 在 PYSPARK 中运行收集时出错

    我正在尝试将网站名称与 URL 分开 例如 如果 URL 是 www google com 则输出应为 google 我尝试了下面的代码 除了最后一行 websites collect 之外 一切正常 我使用数据框来存储网站名称 然后将其转
  • Java 泛型问题:类型参数 E 不在其范围内

    我有一个关于泛型的问题 我有这个方法 根本无法编译 编译器告诉我 type parameter E is not within its bound 我通常在理解编译器错误方面没有问题 但这一个非常棘手 也许我对泛型的了解需要提高 谁能告诉我
  • Javascript将数据保存到文件系统(有用户提示)

    在最新的浏览器 支持 html5 中实现以下目标的最佳方法是什么 我主要针对的是 Google Chrome 在我的应用程序中 数据是通过 JavaScript 操作的 并且需要使用浏览器提示 另存为对话框 将输出写入文件系统 我不确定写入
  • JNI:从C代码到Java和JNI

    背景 我正在 Eclipse 中开发 Android 应用程序 现在遇到问题 需要您的帮助 所以我必须调用写成的函数C来自JAVA应用程序 但在我编写代码的方式上我有一些问题您可以在下面看到 我正在等待您的答案和想法 C Code typd
  • 如何在 C# 驱动程序中设置 MongoDB Change Stream 'OperationType'?

    当运行新的 MongDB 服务器版本 3 6 并尝试将更改流监视添加到集合以获取新插入和文档更新的通知时 我只收到更新通知 而不收到插入通知 这是我尝试添加手表的默认方式 IMongoDatabase mongoDatabase mongo
  • 通过 Javascript 检测图像的 mime 类型

    我正在使用 javascript document images 函数检测网页上的图像 该函数返回图像数组 由于我没有在正在加载的图像上使用任何扩展名 有什么方法可以从中获取图像的 mime 类型吗 除了在 jQuery 中再次请求图像并尝
  • 在 Visual Studio 2010 中调试时忽略跨 AppDomain 的异常

    我在调试调用另一个 AppDomain 的应用程序时遇到问题 因为如果其他 AppDomain 正在执行的任何操作中发生异常 则异常会冒泡并导致 Visual Studio 2010 无论如何都崩溃 我已经正确包装了抛出的方法调用try c
  • 在 Django TEMPLATE DIRS 中使用外部 URL

    Settings py 中的 Django TEMPLATE DIRS 调用 unix 样式斜杠 因此 当我打电话时 get template some template html 在视图中 结果始终从根开始 并导致调用 home user
  • 如何将您的 Unity 项目输入更新到 SteamVR 2.0?

    我有一些 Unity 场景与以前版本的 SteamVR 插件配合得很好 因为有新版本的插件 SteamVR Unity Plugin 2 0 我的代码不再有效 https steamcommunity com games 250820 an
  • 在 CSS 中使用 OS 9 资源分支字体和 @font-face

    我有一些旧的 OS 9 字体 其中包含资源分支中的字体数据 当我尝试在 font face 中链接此类字体并在浏览器中打开 HTML 时 文本仍然以默认字体显示 在搜索过程中 我发现可以使用 rsrc 属性将字体数据复制到常规 ttf 文件
  • OpenMP 中 private 子句中的变量与并行区域中定义的变量之间有什么区别吗?

    我想知道是否有任何理由选择private var OpenMP 中关于 私有 变量本地定义的子句 即 int var pragma omp parallel private var vs pragma omp parallel int va