open mp笔记

这篇具有很好参考价值的文章主要介绍了open mp笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

open mp笔记,cuda,笔记,开发语言,c语言

Open mp在cpu上并行计算,
统一内存访问(OPEN MP pthreads),同一块内存共享多个CPU
非统一内存访问(MPI),每个CPU都有自己对应的内存,通过blus interconnect链接起来,cpu不能直接访问他们的内存,需要进行通信才可以访问到他们所属的memory,
OPEN MP pthreads他们都是针对共享内存编程的API
open mp笔记,cuda,笔记,开发语言,c语言

哪个线程要指定
Open mp,只加简单的预定义,编译器自动编译并行,

Open mp开始运行时候,有一个master thread 主线程(串行执行的)执行—并行(分开了fork),同步,合并,
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言
有一些编译器不支持open mp,加入pragma让编译器暂时不用管这个语言规范
open mp笔记,cuda,笔记,开发语言,c语言open mp笔记,cuda,笔记,开发语言,c语言

获取将要派生的线程的数量,在main函数里,strtol可以获取在程序执行时候获得的一些参数

pragma omp parallel num threads(thread_count)

Hello();

并行执行hello();
Pragma用了这个语句表示这个可能在c中是不被接受的
omp parallel,告诉他我们要使用omp的并行化
num threads(thread_count) 我们要并行的数量有多少个

int my_rank = omp_get_thread num();当前我们创建的线程是排第几个,比如一共有4个线程创建的,那么这个可能的取值就是0,1,2,3,也是线程id
int thread count = omp_get_num threads();当前我们创建的线程总数,按着上边的例子就是4
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

openmp for

open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

for(int i=0;i<1000;i++)中,线程也是比较均匀分配的,可能,线程0:0-249;线程1:250-499;线程2:500-749;线程3:750-1000
均等分配,同时并行执行的
open mp笔记,cuda,笔记,开发语言,c语言

比如要用,fibo[i-1],fibo[i-2],他们如果还没计算出来,就不会得到正确的输出,数据依赖会导致结果错误。

OpenMP编译器不检查被parallel for指令并行化的循环所包含的迭代间的依赖关系
个或者更多个迭代结果依赖于其他迭代的循环,一般不能被正确的并行化

openmp private variables

open mp笔记,cuda,笔记,开发语言,c语言

变量在并行块外定义,也可以在并行中调用
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

对于线程0,可能tmp的值是2,对于线程1,tmp的值为3,1比0慢一点,那么当线程0执行到c[i]的时候此时的结果是3*3,不对应于0线程对应的2的tmp值
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

这样定义了以后,每个线程都有tmp,

关于private的信息

每一个线程都是拥有独自的该变量的副本
如果i被定义为私有变量,那么在for循环里面,所有的线程都不能访问其他(尽管i是共享变量)
所有的线程都不会使用到先前的定义
所有线程都不能给共享的j赋值,(不会改变之前全局定义的j的值)
在循环的入口以及出口,都不会进行定义(私有的j只会在线程内部被定义使用)
open mp笔记,cuda,笔记,开发语言,c语言

Firstprivate

Firstprivate 选项告诉编译器私有变量在第一个循环会继承共享变量的值这个私有的变量只会在每个线程的第一个循环继承,而不会在每个循环中继承和
其使用方法于private几乎一致
#pragma omp parallel for lastprivate(x)
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

本来这个指针a指向0x1,后边改变一下指向0x2,对原来的值是没有影响的,但是要是修改了0x1指向的空间的值,其他线程也是可以看到这个修改的
open mp笔记,cuda,笔记,开发语言,c语言

lastprivate

用私有lastprivate 选项告诉编译器私有变量会在最后-个循环出去的时候变量的值替换掉我们共享变量的值
open mp笔记,cuda,笔记,开发语言,c语言open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

parallel语句

open mp笔记,cuda,笔记,开发语言,c语言

当负责最后一个iteration的线程离开循环的时候它会将该私有变量的值赋值给当前共享变量的值。

只有速度的差异没有代码执行量的差异
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

section选项

open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言
open mp笔记,cuda,笔记,开发语言,c语言

Reduction 归并

open mp笔记,cuda,笔记,开发语言,c语言

会把每一个线程的j加起来
open mp笔记,cuda,笔记,开发语言,c语言

j=10+10+20=40
open mp笔记,cuda,笔记,开发语言,c语言

Barrier

他是用于实现同步的一种手段他会在代码的某个点,令线程停下直到所有的线程都到达该地方
使用的语法如下
#pragmaomp barrier
阻塞在这个语句之前,等所有线程都到了再继续往下执行
许多情况下,它已经能够自动的插入到工作区结尾
比如说在for,single
但是它能够被nowait禁用
open mp笔记,cuda,笔记,开发语言,c语言文章来源地址https://www.toymoban.com/news/detail-738855.html

到了这里,关于open mp笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go】Go语言开发0基础7天入门 - 笔记

    课程来源:【路飞学城】-黑金年卡VIP课程 课程名称:GO语言开发0基础7天入门 讲师:【 前汽车之家架构师 】Wusir-银角大王 官网:点击进入 集python简洁 + C语言性能 详情点击 编程语言 实战经验 源码 并发架构 新语言触类旁通 1.1 开篇介绍(必看) 1.2 环境搭建前戏 1.3 mac系统G

    2024年02月16日
    浏览(37)
  • CUDA笔记3

    每个线程执行一次“Hello world” Block ID: 0, blockDim.x: 2, Thread ID: 0, n: 0,即第1线程块,第1个线程,根据以下公式: 算出n=0,进一步,z[0]=x[0]+y[0]=1+0=1 即第一步算出索引,第二步带入索引值求出z,其余同理。 请注意,由于线程和块的索引计算,每个线程处理不同的数据元素,从

    2024年01月25日
    浏览(13)
  • 【笔记】cuda大师班1-4

    进程(process)一个正在被执行的计算机程序的实例 上下文(context):待处理数据的集合,允许处理器暂停,保持处理的执行和恢复处理 并发:上下文切换,主要应用于单核处理器,循环赛 并行:多线程执行 了解自己电脑的微架构和算力,下载对应版本cuda p.s.这部分网上有

    2024年02月01日
    浏览(14)
  • STM32MP157驱动开发——按键驱动(中断)

    对于使用中断的按键驱动,内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以,需要做的只是修改设备树指定引脚及键值 中断是引入其他基础知识的前提:休眠-唤醒、POLL 机制、异步通知、定时器、中断的线程化处理都离不开中断 设备树相关 查看原理图确定按键使用的

    2024年02月15日
    浏览(32)
  • C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

    参考: 麦子学院-嵌入式C语言高级-内存空间 内存类型资源地址、门牌号的代名词 指针:地址的代名词 指针变量:存放指针这个概念的盒子 *P char *p *p; C语言娟译器对指针这个特殊的概念,有2个疑问? 1、分配一个盒子,盒子要多大? 在32bit系统中,指针就4个字节 2、盘子里存放

    2023年04月22日
    浏览(43)
  • 【笔记】cuda大师班7-11 索引

    注意区分threadIdx,blockIdx 每一个线程在cuda运行时唯一初始化的blockIdx变量只取决于所属的坐标,blockIdx同样也是dim3类型 1.1. 对比blockIdx和threadIdx blockIdx只取决于当前block在grid中的位置 和 blockDim的区别主要是block和grid的区别:block是组成grid的较小单元 blockDim,gridDim有着基本相同

    2024年02月02日
    浏览(23)
  • 驱动开发,stm32mp157a开发板的led灯控制实验

            编写LED灯的驱动,在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制; LED1-PE10 LED1亮灭: RCC寄存器[4]-1 0X50000A28 GPIOE_MODER[21:20]-01 (输出) 0X50006000 GPIOE_ODR[10]-1(输出高电平) 0(输出低电平)0X50006014 LED2-PF10 LED2亮灭: RCC寄存器[5]-1 0X50000A28 GPIOE_MODER[21:20]

    2024年02月09日
    浏览(34)
  • 笔记--Ubuntu20.04安装Nvidia驱动、CUDA Toolkit和CUDA CuDNN

    目录 1--安装Nvidia驱动 2--安装CUDA 2-1--禁用nouveau 2-2--选择CUDA Toolkit 2-3--下载和安装CUDA Toolkit 2-4--配置环境变量 2-5--测试是否安装成功: 3--安装CUDA CuDNN 4--测试pytorch能否使用Cuda ① 查看可安装的Nvidia驱动版本: ② 安装相应版本的Nvidia驱动: 博主这里选择的是第一个,也可以安

    2024年02月02日
    浏览(53)
  • STM32MP157驱动开发——按键驱动(工作队列)

    定时器、下半部 tasklet,它们都是在中断上下文中执行,它们无法休眠。当要处理更复杂的事情时,往往更耗时。这些更耗时的工作放在定时器或是下半部中,会使得系统很卡;并且循环等待某件事情完成也太浪费CPU 资源了。如果使用线程来处理这些耗时的工作,那就可以解

    2024年02月15日
    浏览(27)
  • STM32MP157驱动开发——按键驱动(tasklet)

    阅读Linux 系统中异常与中断可知,Linux 系统对中断处理的演进过程中,实现了中断的扩展:硬件中断、软件中断 硬件中断有:GPIO,网络中断(net),系统滴答中断(tick)等 软件中断有:定时器,tasklet等 内核中的软中断: 该数组里面有个action成员,该成员是个函数,函数会调

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包