C++ -- OpenMP 笔记

2023-05-16

@toc

OMP

CMake Setup

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenMP REQUIRED)

# Set Flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

# Header Path
include_directories(
    ${OpenMP_CXX_INCLUDE_DIRS}
)

# Link 
target_link_libraries(target ${OpenMP_CXX_LIBRARIES})

Directive

openmp 代码段的起始符号

#pragma omp directive-name [clause[ [,] clause]...] new-line
  • directive-name 只能有一个;
  • directive 只作用后面一行(或者一个代码块)的代码。
  • directive 可以嵌套。

directive-name 选择:

  1. parallel
#pragma omp parallel [clause[ [, ]clause] ...] new-line 
	structured-block

structured-block 中的代码会被并行执行;

但是并不代表 block 中的代码会被执行 N 次。针对 for loop 会被执行循环次数;针对 sections 只会执行一次。

  1. for
#pragma omp for [clause[[,] clause] ... ] new-line 
	for-loop

for 属于 Work-sharing Constructs,本身并不会启动新的线程,只是将后续的代码分配到不同的线程;因此需要在 parallel 环境下使用。

for-loop 需要采用最普遍的写法 — for(int i = 0; i < 100; i++)

for 循环的末尾默认有一个 barrier (保证所有线程同时结束并入主线程),除非 clause 包含 nowait

  1. parallel for

clause 包含前两者的 clause,除了 nowait

#pragma omp parallel for [clause[[,] clause] ...] new-line 
	for-loop
  1. parallel sections & section

section 之间是并行的。但是 sections 后的代码块只执行一次

#pragma omp parallel sections
   {
	[#pragma omp section new-line
		structured-block]
	
	[#pragma omp section new-line
		structured-block]
	... 
}
  1. single & master & critical & atomic

single 后的代码块只被分配到一个线程(不一定是主线程),只执行一次。

master 后的代码块被分配到主线程。( single 特殊形式)

critical 后的代码块同一时间只有一个在执行。

atomic 后的代码块中访问的内存同一时间只暴露给一个线程。

部分编译器会把 atomic 当作 critical 处理,但是两者是有细微差别的。在进行原子操作时,atomic 的优化会比 critical 更好。

  1. barrier & flush

    • barrier 同步所有线程;

    • flush:同步数据:CPU 将寄存器中的值写回内存,保证数据一致。

#pragma omp flush [(variable-list)] new-line

variable-list 为空,则等同于 barrier;

  1. ordered

ordered 必须和 for 使用;ordered 后的代码块会按照 for 循环中的顺序执行。

同时 for 后的 clause 中需要有 ordered

共享数据与私有数据

部分 directive 允许用户通过 clause 更改后续代码块中变量的属性。这些改变仅在后续代码块中生效。当一个变量在 Construct 构建时是可见的,如果它既没有在 shared 也没有在 threadprivate 中出现,那么则是 shared。动态申请的(堆中的)内存是 shared (但是指针变量不一定是)。代码块中定义的变量是 private

  • shared clause

  • private clause:

每个线程都会调用默认构造函数构造一个相同类的实例。

  • copyin clause:

会将主线程中的对象复制到线程的私有变量中。

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

C++ -- OpenMP 笔记 的相关文章

  • omp 并行与 omp 并行 for

    这两者有什么区别 A pragma omp parallel pragma omp for for int i 1 i lt 100 i B pragma omp parallel for for int i 1 i lt 100 i 这些
  • 加速位图灰度转换,OpenMP 是 C# 中的一个选项吗?

    请帮助我使用 openmp 使此代码并行 此代码在单击按钮时运行 文本框为 128 using System using System Collections Generic using System ComponentModel usin
  • 随机密码生成器上的 OpenMP 多线程

    我正在尝试使用集成到 Visual Studio 2010 中的 OpenMP 多线程来制作快速密码生成器 假设我有一个基本的字符串生成器 它可以从字符串中随机提取字符 srand time 0 for i 0 i lt length i
  • OpenMP 中归约运算的执行顺序

    有没有办法知道 OpenMP 中归约运算符的执行顺序 换句话说 我想知道线程如何执行归约操作 是从左到右吗 当存在不是 2 的幂的数字时会发生什么 我想你会发现 OpenMP 只会减少关联操作 例如 and 如果您愿意 也可以是加法和乘法
  • 我可以安全地将 OpenMP 与 C++11 结合使用吗?

    OpenMP 标准仅考虑 C 98 ISO IEC 14882 1998 这意味着在 C 03 甚至 C 11 下没有支持使用 OpenMP 的标准 因此 任何使用 C gt 98 和 OpenMP 的程序都会在标准之外运行 这意味着即使它
  • 了解 OpenMP 有关 fork 的缺点

    我想了解它们在这里的意思 为什么这个程序会 挂起 From https bisqwit iki fi story howto openmp https bisqwit iki fi story howto openmp OpenMP 和fo
  • OpenMP 并行减少会产生错误的结果

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

    免责声明 我很确定这个问题已经在某个地方得到了回答 但我自己和另一个人一直在努力搜索 但没有结果 我有一个看起来像这样的代码 PROGRAM main omp parallel do omp private somestuff shared
  • 通过向量 OpenMP C 进行矩阵乘法 [重复]

    这个问题在这里已经有答案了 我正在尝试用 C OpenMP 通过向量乘法编写矩阵 但是当我添加处理器时我的程序会变慢 1 proc 1 3 s 2 proc 2 6 s 4 proc 5 47 s 我在我的电脑 核心 i5 和我们学校的集群
  • 如何在工作线程中重用主线程创建的OMP线程池?

    在我的 C 应用程序开始附近 我的主线程使用 OMP 并行化多个 for 循环 在第一个并行化 for 循环之后 我发现所使用的线程在应用程序的持续时间内仍然存在 并且可以使用以下命令 在 CentOS 7 中工作 重用于从主线程执行的后续
  • 如何提高 OpenMP 代码的性能?

    我目前正在尝试提高我的代码的并行性能 但我对 OpenMP 仍然是新手 我必须迭代一个大容器 在每次迭代中从多个条目读取并将结果写入单个条目 下面是我正在尝试做的一个非常简单的代码示例 data是一个指向数组的指针 其中存储了许多数据点 在
  • 在程序源文件中使用脚本变量 OMP_NUM_THREADS

    如果我在集群上运行 C 代码 是否可以在我的程序中使用 OMP NUM THREADS 的值 例如 假设我有两个 cpp 文件 main cpp 和 func cpp 其中 func cpp 是使用 OpenMP 并行编写的 我希望能够定义
  • Xcode C++ omp.h 文件未找到

    我正在尝试将 openmp 包含到我的 Xcode C 项目中 我已将 Xcode 中的编译器更改为 LLVM GCC 4 2 添加 fopenmp 作为 CFlag 并在 xcode 中启用了 OpenMP 支持 但它仍然显示 omp h
  • OpenMP 中使用循环的并行部分

    我想知道是否有任何技术可以使用 for 循环在 OpenMp 中创建并行部分 例如 我不想创建 n 个不同的 pragma omp 部分 而是使用 n 次迭代来创建它们for loop每个部分都有一些变化的参数 pragma omp par
  • c openmp并行用于并行区域内

    我的问题是这样的one https stackoverflow com questions 11493265 for loop inside parallel region 但我想做一些不同的事情 例如 在我的并行区域内 我想在 4 个线程
  • OpenMp 根据变量设置并行循环的线程数

    有没有办法根据变量的值设置 OpenMP 并行区域的线程数 最初 整个应用程序的线程数 nofCores 在我的 AMD FX 8350 上 nofCores 8 对于这个区域 如果变量是 3 那么我只需要 3 个线程 如果变量 gt 核心
  • OpenMP:不要使用超线程核心(一半“num_threads()”带有超线程)

    In g 4 7 中的 OpenMP 并行 效率不高吗 5x CPU 时为 2 5x https stackoverflow com questions 36950532 is openmp parallel for in g 4 7 no
  • 使用 openmp 优化 N-queen

    我正在学习 OPENMP 并编写以下代码来解决 n 皇后问题 Full Code https github com Shafaet Codes blob master OPENMP Parallel 20N Queen 20problem
  • OpenMP 线程映射到物理内核

    于是我在网上查了一段时间没有结果 我是 OpenMP 的新手 所以不确定这里的术语 但是有没有办法从 OMPThread 由 omp get thread num 给出 和线程将运行的物理核心找出特定机器的映射 我还对 OMP 分配线程的精
  • 如何判断 OpenMP 是否正常工作?

    我正在尝试以并行模式运行 LIBSVM 但我的问题一般是在 OpenMP 中 根据LIBSVM 常见问题解答 http www csie ntu edu tw cjlin libsvm faq html f432 我已使用 pragma 调

随机推荐

  • java防止 csrf 攻击 --- 采用 spring .

    CSRF xff08 Cross site request forgery xff09 xff0c 中文名称 xff1a 跨站请求伪造 xff0c 也被称为 xff1a one click attack session riding xff
  • Gson解析数组多类型元素

    why used gson Gson is a Java library that can be used to convert Java Objects into their JSON representation It can also
  • js中获取时间new Date()详细介绍

    1 var myDate 61 new Date Date 返回当日的日期和时间 getDate 从 Date 对象返回一个月中的某一天 1 31 getDay 从 Date 对象返回一周中的某一天 0 6 getMonth 从 Date
  • 如何让一个行内元素(如一张图片)在div中居中

    xff08 1 xff09 第一种 xff1a 用vertical align lt div class 61 34 method1 34 gt lt span class 61 34 tiptop 34 gt lt span gt lt
  • 释放webpack tree-shaking潜力之webpack-deep-scope-analysis-plugin

    在上周末广州举办的 feday 中 webpack 的核心开发者 Sean 在介绍 webpack 插件系统原理时 隆重介绍了一个中国学生于 Google 夏令营 在导师 Tobias 带领下写的一个 webpack 插件 https gi
  • iframe跨域通信的通用解决方案

    此方案已有新版本 请查看 iframe跨域通信的通用解决方案 第二弹 xff08 终极解决方案 xff09 本文章可做技术学习供继续交流 一 背景 在这个Web页面越来越丰富的时代 xff0c 页面通过iframe嵌入其他的页面也越来越常见
  • C++实现轻量级RPC分布式网络通信框架

    前言 xff1a 2022 4 14更新 xff1a 在我重新回顾这篇文章的时候 xff0c 我觉得里面内容有点乱 xff0c 主要还是因为RPC里面涉及到很多概念和知识点 本来代码内容就已经挺抽象了 xff0c 还要结合各种概念 xff0
  • 浅谈JavaScript设计模式

    创建型模式 xff1a 该模式处理的是用于创建对象的各种机制 工厂方法抽象工厂建造者原型单例 结构型模式 xff1a 考虑的是对象的组成以及对象彼此之间的关系 适配器桥接组合装饰器外观享元代理 行为型模式 xff1a 关注的是对象之间的依赖
  • Ardupilot-SITL仿真模拟调试

    1 配置SITL仿真调试 span class token punctuation span span class token operator span waf configure span class token operator sp
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • STM32 时钟 定时器基础

    STM32 Clock Tree 时钟源 HSI xff1a xff08 High Speed Internal xff09 内部的 RC 震荡电路产生时钟信号 HSE xff1a xff08 High Speed External xff
  • Albumentation

    文章目录 AlbumentationClassificationSegmentationDetectionKeyPoints Augmentation Albumentation 所有实现的变换 变换以及支持的类型 此处 Classific
  • Pytorch 分布式训练

    文章目录 分布式训练OverviewDP or DDPDPDDP TCP 初始化Moco TCP 初始化例子 ENV 初始化可选后端进程间通信操作Template 区分概念 xff1a Machine vs Device 多机 Machin
  • FLANN C++ 使用

    FLANN FLANN 库 xff0c 包含 KNN 算法 众多工程 xff08 例如 OpenCV xff09 使用了 FLANN xff0c 这里单独介绍这个库 xff0c 方便以后单独使用 由官方 Latex 编译的文档链接 xff0
  • HDF5 C++ 使用

    HDF5 简介 HDF5 可以用来存储异构数据对象 xff0c 包括图片 xff0c 表 xff0c 图 xff0c 甚至 PDF 和 Excel HDF5 中的数据存储在不同组 Group 中 xff0c 类似于 Linux 文件树结构
  • Pandoc 使用

    文章目录 PandocInstallationLatex 到 Word命令详解 Pandoc Installation MacOS brew span class token function install span pandoc Lat
  • Docker -- DockerFile 讲解

    文章目录 DockerFile 指令讲解FROMCOPY 写在开头 xff1a 实验室给的电脑只能装 20 04 然后跑仿真需要在 18 04 20 04 的 Gazebo 居然不能支持 xff01 要是有人知道如何在 20 04 中使用
  • MySQL介绍及CRUD操作。

    目录 一 基本介绍 1 数据库结构 2 数据库增删改查 二 增删改查语句 1 insert 添加数据 2 update 修改操作 3 delete 删除操作 4 select 查询操作 5 加密和系统函数 6 流程控制函数 三 表的增删改查
  • Docker 容器

    文章目录 容器图形界面XserverVNC 容器 图形界面 Xserver 采用 ROS 官网的教程 这里相当于是将容器的图形信息发送给宿主的 Xserver 然后显示在你的电脑屏幕上 首先需要打开主机 Xserver 权限 xff1a x
  • C++ -- OpenMP 笔记

    64 toc OMP CMake Setup set CMAKE CXX STANDARD 14 set CMAKE CXX STANDARD REQUIRED ON find package OpenMP REQUIRED Set Fla