FirstPrivate 和 LastPrivate 与 OpenMP 中的 Private 子句有何不同?

2023-12-10

我看了官方的定义,但还是很困惑。

firstprivate:指定每个线程应该有自己的变量实例,并且应该使用变量的值来初始化该变量,因为它存在于并行构造之前。

对我来说,这听起来很像私人的。我寻找了示例,但我似乎不明白它有何特别之处或如何使用它。

lastprivate:指定变量的封闭上下文版本设置为等于执行最终迭代(for 循环构造)或最后一个部分(#pragmasections)的线程的私有版本。

我觉得通过下面的例子我对这个问题有了更好的理解:

#pragma omp parallel
{
   #pragma omp for lastprivate(i)
      for (i=0; i<n-1; i++)
         a[i] = b[i] + b[i+1];
}
a[i]=b[i];

所以,在这个例子中,我明白lastprivate允许i作为最后一个值返回到循环之外。

我今天刚开始学习OpenMP。


private变量没有初始化,即它们像任何其他本地自动变量一样以随机值开始(并且它们通常使用每个线程的堆栈上的自动变量来实现)。以这个简单的程序为例:

#include <stdio.h>
#include <omp.h>

int main (void)
{
    int i = 10;

    #pragma omp parallel private(i)
    {
        printf("thread %d: i = %d\n", omp_get_thread_num(), i);
        i = 1000 + omp_get_thread_num();
    }

    printf("i = %d\n", i);

    return 0;
}

如果有四个线程,它会输出类似以下内容的内容:

thread 0: i = 0
thread 3: i = 32717
thread 1: i = 32717
thread 2: i = 1
i = 10

(another run of the same program)

thread 2: i = 1
thread 1: i = 1
thread 0: i = 0
thread 3: i = 32657
i = 10

这清楚地表明了i在并行区域内是随机的(未初始化),并且在并行区域之后对其进行的任何修改都是不可见的(即变量在进入该区域之前保持其值)。

If i被制作firstprivate,然后用并行区域之前的值进行初始化:

thread 2: i = 10
thread 0: i = 10
thread 3: i = 10
thread 1: i = 10
i = 10

仍对值进行修改i并行区域内的内容在其之后不可见。

你已经知道了lastprivate(它不适用于简单的演示程序,因为它缺乏工作共享结构)。

So yes, firstprivate and lastprivate只是特殊情况private。第一个导致将值从外部上下文引入并行区域,而第二个将值从并行区域传输到外部上下文。这些数据共享类背后的基本原理是,并行区域内的所有私有变量都会隐藏外部上下文中的变量,即不可能使用赋值操作来修改外部值i从平行区域内部。

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

FirstPrivate 和 LastPrivate 与 OpenMP 中的 Private 子句有何不同? 的相关文章

  • OpenMP 中归约运算的执行顺序

    有没有办法知道 OpenMP 中归约运算符的执行顺序 换句话说 我想知道线程如何执行归约操作 是从左到右吗 当存在不是 2 的幂的数字时会发生什么 我想你会发现 OpenMP 只会减少关联操作 例如 and 如果您愿意 也可以是加法和乘法
  • OpenMP“master”编译指示不得包含在“parallel for”编译指示内

    为什么英特尔编译器不允许我指定 openmp 中的某些操作parallel for块应该仅由主线程执行吗 如果没有这种功能 我该如何实现我想要实现的目标 我想做的是通过并行回调更新进度条 long num items computed 0
  • 使用一个线程执行一个部分,并使用多个线程执行一个 for 循环

    我正在使用 OpenMP 并且想要生成线程 以便一个线程执行一段代码并完成 与运行并行 for 循环迭代的 N 个线程并行 执行应该是这样的 Section A one thread Section B parallel for multi
  • 了解 OpenMP 有关 fork 的缺点

    我想了解它们在这里的意思 为什么这个程序会 挂起 From https bisqwit iki fi story howto openmp https bisqwit iki fi story howto openmp OpenMP 和fo
  • 用于大型密集矩阵乘法的循环平铺/分块

    我想知道是否有人可以向我展示如何有效地使用循环平铺 循环阻塞进行大型密集矩阵乘法 我在做C AB具有 1000x1000 矩阵 我按照维基百科上的循环平铺示例进行操作 但使用平铺得到的结果比不使用平铺的结果更差 http en wikipe
  • 如何在工作线程中重用主线程创建的OMP线程池?

    在我的 C 应用程序开始附近 我的主线程使用 OMP 并行化多个 for 循环 在第一个并行化 for 循环之后 我发现所使用的线程在应用程序的持续时间内仍然存在 并且可以使用以下命令 在 CentOS 7 中工作 重用于从主线程执行的后续
  • g++:错误:libgomp.spec:没有这样的文件或目录

    我使用 g GCC 4 7 2 在 Windows 7 64 位版本上 下载自http nuwen net mingw html http nuwen net mingw html 我尝试使用 fopenmp 标志并收到错误 g 错误 li
  • c openmp并行用于并行区域内

    我的问题是这样的one https stackoverflow com questions 11493265 for loop inside parallel region 但我想做一些不同的事情 例如 在我的并行区域内 我想在 4 个线程
  • Fortran + OpenMP + 多态性:到底不支持什么?

    我知道 OpenMP 4 5 标准表示 Fortran 中不支持 多态实体 这到底是什么意思 这是否仅排除对具有 PASS 属性的类型绑定过程的调用 但我仍然可以以其他方式使用具有类型绑定过程的用户定义类型的实例 例如访问其组件 此限制是否
  • 为什么 OpenMP SIMD 指令会降低性能?

    我正在学习如何在 OpenMP Fortran 中使用 SIMD 指令 我 写了简单的代码 program loop implicit none integer i j real 8 x x 0 0 do i 1 10000 do j 1
  • 是否可以将 OpenMP 库与 Android NDK 一起使用?

    是否可以将 OpenMP 库与 Android NDK 一起使用 也许有人已经尝试将它们编译在一起并可以提供一些提示 随着双核平板电脑 智能手机的出现 我认为在应用程序开发中使用 OpenMP 功能会非常好 先感谢您 对于现在遇到这个问题的
  • 测量 OpenMP Fork/Join 延迟

    由于 MPI 3 具有共享内存并行功能 并且它似乎与我的应用程序完美匹配 因此我正在认真考虑将我的混合 OpemMP MPI 代码重写为纯 MPI 实现 为了给棺材里钉上最后一颗钉子 我决定运行一个小程序来测试 OpenMP fork jo
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • OpenMP:无法并行化嵌套 for 循环

    我想将循环与其中的内循环并行化 我的代码如下所示 pragma omp parallel for private jb ib shared n Nb lb lastBlock jj W WT schedule dynamic private
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • OpenMP 共享与第一私有性能比较

    我有一个 pragma omp parallel for在类方法内循环 每个线程只读访问很少的方法局部变量 很少调用私有数据和方法的参数 所有这些都在一个声明中声明shared条款 我的问题 性能方面不应该有任何区别声明这些 变量share
  • OpenMP 和 C++:this 指针

    Is thisOpenMP 中始终共享指针 尽管编译器不会抱怨以下代码default none pragma omp parallel for default none shared n for SInt i 0 i lt n i f i
  • OpenMP 超线程导致性能不佳:如何将线程绑定到核心

    我正在开发大型密集矩阵乘法代码 当我分析代码时 它有时会达到我的四核系统的峰值失败率的 75 而其他时候则达到约 36 代码执行之间的效率不会改变 它要么从 75 开始 并继续保持该效率 要么从 36 开始 并继续保持该效率 我已将问题追溯

随机推荐

  • Powerpoint VBA - 更改配色方案

    我需要通过 VBA 代码将演示文稿的配色方案更改为 Office 2007 2010 我怎样才能做到这一点 我尝试了类似下面的方法 但似乎不起作用 ActivePresentation ColorSchemes Add ActivePres
  • 如何在 laravel 5.3 中显示当前日期的日期名称?

    我想在 laravel 5 3 中打印当前日期的名称 我可以通过以下方式获取当前日期 上面的代码打印 25 但我希望它打印星期四 我应该怎么做 Try this
  • 有没有办法在密码文本模式下设置 ASP.NET 文本框密码字符?

    我希望当用户输入文本时 它应该显示 而不是一个简单的星号 有没有办法 在win forms的TextBox中有一个属性PasswordChar 它在web中有何相似之处 不 这是特定于浏览器的 也许你可以用 javascript 来伪造这个
  • 如何在 Delphi XE 中国际化我的应用程序?

    我正在使用 Delphi 中包含的翻译管理器 xe8 但在旧版本中应该相同 我转到 Projet gt 语言 gt 添加 选择英语 然后我翻译文本 这里是按钮 我全部更新并编译 我得到了 exe 和 enu 文件 它是法语的 当我转到 Pr
  • matlab中的KNN算法

    我正在研究拇指识别系统 我需要实现 KNN 算法来对我的图像进行分类 根据this 它只有 2 个测量值 通过这些测量值计算找到最近邻居的距离 但在我的例子中 我有 400 张 25 X 42 的图像 其中 200 个用于训练 200 个用
  • Spring Boot REST · @Constraint 用于删除?

    我正在开发一个使用 Spring Boot REST HATEOAS Hibernate 和 PostgreSQL 的系统后端 为了验证 我开始使用以下类extend org springframework validation Valid
  • LibGDX 移动旋转相机

    我在使用 LibGDX 构建的应用程序中遇到了一种情况 我需要相机能够旋转 并且可以由用户移动 并且能够缩放 我的相机移动和缩放相机的控件工作得很好 但是 当相机旋转时 相机会根据该旋转移动 例如 如果相机向左旋转 45 度 并且用户向右拖
  • 张量流/keras中输入的自相关

    我有一个一维输入信号 我想计算自相关作为神经网络的一部分 以便在网络内部进一步使用 我需要对输入与输入本身进行卷积 在 keras 自定义层 张量流中执行卷积 我们需要以下参数data shape is batch in height in
  • data.frame 中每组的平均值[重复]

    这个问题在这里已经有答案了 我有一个data frame我需要计算每组的平均值 即每Month 以下 Name Month Rate1 Rate2 Aira 1 12 23 Aira 2 18 73 Aira 3 19 45 Ben 1 5
  • 使用 javascript 以管理员身份运行批处理的简单方法

    我想导出一种简单可靠的方法来自动提升正在运行的批处理 而无需使用其他线程中建议的额外 VBS 文件或提升的快捷方式 通过 javascript 从批处理中调用 UAC 对话框可确保代码简短 当在对话框中选择 是 时 下面的脚本会自动将用户正
  • 多维数组中的多个文件上传

    我有一个 php 表单 行数未知 用户可以在其中上传文件 为此 我使用二维数组
  • 如何使用java读取https页面内容? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何使用java读取https页面内容 以下是检索 页面内容 的示例https maven apache org guides mini guide repository ssl
  • 抛出异常时不会调用移动构造函数

    我有一个累积当前异常的变量 并且需要在引发当前异常时进行清理 以便不会再次报告相同的错误 问题是throw std move ex 不调用移动构造函数 这会清理ex 而是调用复制构造函数 以便ex也保留已经抛出的错误 MVCE 如下 inc
  • Svelte:如何将操作传递给组件?

    有一个类似的问题被问到here但我不认为答案适用于我的用例 我在用着纤薄的材质 UI并试图延长数据表具有拖放行功能的组件 我正在使用简洁的 dnd 操作模块支持拖放行为 以下效果很好 我可以拖放表格的行 table thead thead
  • 卸载视图控制器时,保留/强类成员变量会自动清理吗?

    我有以下财产 h property nonatomic strong NSMutableDictionary cache m synthesize cache cache 的数据 cache建立在 viewDidLoad 之上 现在我想知道
  • 如何在Spring Security中传递参数和注销成功url?

    我在我的 spring boot 应用程序中使用基于 java 的 spring 安全配置 当用户单击注销链接时 用户将被重定向到登录页面 在本例中 我需要在注销成功 url 中传递自定义参数 例如当我注销时 应用程序被重定向到http l
  • 如何从窗口获取文本内容

    我有一个展示一本书的窗口 下面的两个较小的框中 有打开的书的页码和卷信息 我可以轻松获取该信息 如下所示 ControlGetText volume ThunderRT6TextBox3 ControlGetText page Thunde
  • 如何解决致命异常:Thread-11

    现在我正在开发一个 使用异步任务我面临这个错误 任何人都知道这一点 10 03 19 04 55 662 E AndroidRuntime 1547 FATAL EXCEPTION Thread 11 10 03 19 04 55 662
  • 每次部署后回形针文件都会被删除

    我使用 Paperclip gem 来存储图片 并且在本地主机上它工作得很好 但是 我添加到实时应用程序中的任何图片都会在每次部署后被删除 我使用Git来部署 这是我的部署过程 bundle exec cap production depl
  • FirstPrivate 和 LastPrivate 与 OpenMP 中的 Private 子句有何不同?

    我看了官方的定义 但还是很困惑 firstprivate 指定每个线程应该有自己的变量实例 并且应该使用变量的值来初始化该变量 因为它存在于并行构造之前 对我来说 这听起来很像私人的 我寻找了示例 但我似乎不明白它有何特别之处或如何使用它