CUDA共享内存

GPU中有两种类型的内存:

  • 板载内存
  • 片上内存

全局内存是较大的板载内存,延迟相对较高;共享内存是较小的片上内存,具有相对较低的延迟。共享内存的常用用途:

  • 块内线程的通信通道
  • 全局内存数据的可编程管理缓存
  • 高速暂存存储器,用于转换数据以优化全局内存访问模式

共享内存

每个SM都有一个小的低延迟内存池,这个内存池被该SM执行的线程块中的所有线程共享。

每个线程块开始时,会分配给它一定数量的共享内存。这个共享内存的地址空间被线程块中所有的线程共享。它的内容和创建时所在的线程块具有相同的生命周期。

如果多个线程访问共享内存中的同一个字,一个线程读取该字后,通过多播把它发送给其他线程。

共享内存分配

可以静态或者动态的分配共享内存变量。

共享内存变量用以下修饰符声明:

__shared__

如果在核函数内部声明,那么这个变量的作用域就局限在该内核中。如果在文件的任何核函数外进行声明,那么这个变量的作用域对所有核函数来说都是全局的。

如果一个共享内存的大小在编译时是未知的,可以用extern关键字声明一个未知大小的数组。例如,

extern __shared__ int a[];

这个数组大小是未知的,所以在每个核函数被调用时,需要动态分配共享内存,将所需的大小按字节数作为三个尖括号内的第三个参数

kernal<<<grid,block,n*sizeof(int)>>>(...)

只能动态声明一维数组

共享内存存储体和访问模式

优化内存性能时,要度量的两个关键属性是:延迟和带宽。共享内存可以用来隐藏全局内存延迟和带宽对性能的影响。

内存存储体

为了获得高内存带宽,共享内存被分为32个同样大小的内存模型,它们被称为存储体,可以被同事访问(因为一个线程束内有32个线程)。

根据GPU的计算能力,共享内存的地址在不同模式下会映射到不同的存储体中。

存储体冲突

在共享内存中,当多个地址请求落在相同的内存存储体上时,就会发生存储体冲突。存储体冲突会将并行内存事务,变成顺序执行,降低性能。

在线程数发出共享内存请求时,有三种典型的模式:

  • 并行访问:多个地址访问多个存储体
  • 串行访问:多个地址访问同一个存储体
  • 广播访问:单一地址读取单一存储体

如图所示,不同的线程访问了同一个存储体。对于这样的请求,会产生两种可能得行为:

  • 线程访问同一存储体中的相同地址,广播访问无冲突
  • 线程访问同一存储体中的不同地址,会发生存储体冲突

访问模式

共享内存存储体的宽度规定了共享内存地址与共享内存存储体的对应关系。内存存储体的宽度随设备计算能力不同而变化:

  • 计算能力2.x的设备中为4字节,32位
  • 计算能力3.x的设备中为8字节,64位

对费米设备,存储体宽度是32位,并且有32个存储体。从共享内存地址到存储体的映射可以按如下计算

存储体索引=(字节地址/4)%32

对于开普勒设备,共享内存有32个存储体,有两种地址模式

  • 64位模式
  • 32位模式

64位模式存储体冲突更少。

内存填充

内存填充是避免存储体冲突的一种方法。、

画个图说明如何通过内存填充来避免存储体冲突。

假设有4个存储体,所有线程都访问bank0的四个不同的地址,造成了四向的存储体冲突。解决这种冲突的一个方法是在每N个元素之后添加一个字,N是存储体数量。

现在,之前所有属于bank0的字都移动到了其他bank中。填充的内存不能用于存储数据,只能用来移动数据。

注意,需要重新计算数组索引以访问正确的数据;并且在不同架构的设备中,填充可能造成的影响不同。

配置共享内存量

每个SM都有64KB的片上内存,共享内存和一级缓存共享该硬件资源。CUDA为配置一级缓存和共享内存的大小提供了两种方法:

  • 按设备配置
  • 按核函数配置

典型的情况如下

  • 核函数使用较多的共享内存时,倾向于分配更多的共享内存
  • 核函数使用较多的寄存器时,倾向于分配更多的一级缓存

同步

弱排序内存模型

内存的访问不一定按照它们在程序中出现的顺序进行。

GPU线程在不同内存中写入数据的顺序不一定和这些数据在源代码中访问的顺序相同。

为了显式的强制程序以一个确切的顺序执行,必须在应用程序代码中插入内存栅栏和障碍。这是保证与其他线程共享资源的核函数行为正确的唯一途径。

显式障碍

在CUDA中,障碍只能在同一线程块的线程间执行。在核函数中,调用以下函数来指定一个障碍点

void __syncthreads();

它要求块中的所有线程必须等待直到所有线程都到达该点。并且保证在障碍点前,被这些线程访问的所有全局和共享内存对同一块中的所有线程都可见。

内存栅栏

内存栅栏的功能可以确保栅栏前的任何内存写操作对栅栏后的其他线程都是可见的。根据所需范围,有三种内存栅栏:块,网格或系统。

void __threadfence_block();

在线程块内创建内存栅栏。

void __threadfence();

网格级内存栅栏,挂起调用的线程,直到全局内存中的所有写操作对相同网格内的所有线程都是可见的。也就是开始__threadfence()后面的操作必须等到所有线程都完成__threadfence()之前的操作。

void __threadfence_system();

保证该线程在全局内存、锁页主机内存和其他设备内存中的所有写操作对全部设备中的线程和主机线程可见。

volatile修饰符

在全局或共享内存中使用volatile修饰符声明一个变量,可以防止编译器优化,编译器优化可能会将数据暂时存在寄存器或本地内存中。使用volatile修饰符时,编译器假定其他任何线程在任何时间都可以更改或使用该变量的值。也就是说,这个值的修改会立即在全局或共享内存中执行,忽略缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/318536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设备能源数据采集新篇章

在当今这个信息化、智能化的时代&#xff0c;设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天&#xff0c;我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关&#xff01; 一、HiWoo Box网关&#xff1a;一站式解决…

confluence 设置https代理

使用nginx反待confluence并开启https后&#xff0c;登录confluence会一直提示&#xff1a;scheme、proxyName、proxyPort设置错误。 解决办法&#xff1a; find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

jvm垃圾回收机制介绍

JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它负责执行字节码文件。JVM的工作原理主要包括以下几个部分&#xff1a;类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码&#xff0c;执行引擎负…

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

微信开发api、微信视频号开发

接口地址&#xff1a; http://api.videostui.com/finder/v2/api/login/checkLogin 接口说明 获取到登录二维码后需每间隔5s调用本接口来判断是否登录成功新设备登录平台&#xff0c;次日凌晨会掉线一次&#xff0c;重新登录时需调用获取二维码且传appId取码&#xff0c;登录成…

莫比乌斯变换的数学原理

关键词&#xff1a;Mobius Transformations 一、说明 关于莫比乌斯变换&#xff0c;是一个代数几何变换的重要概念。也是双曲几何的重要理论&#xff0c;比如庞加莱盘就是建立在这个理论上&#xff0c;那么这个变换到底有哪些内容&#xff1f;本文将做出详细的解读。 二、线…

使用量排名前50的GPTs趋势和特征

Chatgpt的gpt商店已经有几千gpts了。目前哪些gpts比较受欢迎呢&#xff1f;有哪些趋势和投资呢? 根据whatplugin.ai&#xff08;截止日期为2024年3月&#xff09;&#xff0c;使用量最多的50个gpts数据分析结果如下&#xff1a; GPTs类型的分布情况如下&#xff1a; 图像生成…

FreeRTOS任务通知

FreeRTOS任务通知 FreeRTOS 新增了任务通知(Task Notifictions)这个功能&#xff0c;可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高&#xff0c;任务通知在 FreeRTOS 中是一个可选的功能&#xff0c; 使用队列、信号量、事件标志…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读&#xff0c;学习本章前&#xff0c;可以先去看看基础篇&#xff1a;1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战&#xff0c;关于sqlilabs靶场的搭建&#xff1a;Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap&#xff0c;关于sqlmap的命令&…

stm32f103zet6_串口实现-DHT11-tim1(定时)

1思路 1打开时钟 1.1使用定时器实现us级的计时 1.2在打开串口 1,3在DHT11驱动中修改引脚 stm32cudeMX 配置 1打开时钟 2打开串口 3打开tim1(定时器) 4生成代码 代码设置 1导入DHT11库(tim.h是定时器的文件系统自动生成的) DHT11.c #include "dht11.h" #inc…

PHP算命源码_最新测算塔罗源码_可以运营

功能介绍 八字精批、事业财运、姓名分析、宝宝起名、公司测名、姓名配对、综合详批、姻缘测算、牛年感情、PC版测算、八字合婚、紫微斗数、鼠年运程、月老姻缘、许愿祈福、号码解析、塔罗运势、脱单占卜、感情继续、脱单占卜、塔罗爱情、心理有你、能否复合、暗恋对象、是否分…

5.3 进程间通信管道和共享内存

每次打开一个网页都是一个进程 进行管道之间通信的方式&#xff1a;以前学到的有可以在磁盘上开辟空间进行交互&#xff0c;也可以在内存中开辟缓冲区进行交互。 一定注意可读性 管道就是属于在内存中的一片缓冲区&#xff0c;管道可以在命令行中创建管道mkfifo也可以在vim中…

java技术栈快速复习05_基础运维(linux,git)

Linux知识总览 linux可以简单的理解成和window一样的操作系统。 Linux和Windows区别 Linux是严格区分大小写的&#xff1b;Linux中一切皆是文件&#xff1b;Linux中文件是没有后缀的&#xff0c;但是他有一些约定俗成的后缀&#xff1b;Windows下的软件一般是无法直接运行的Li…

京东JD商品SKU信息API返回值解析:精准掌握商品属性

在电子商务迅猛发展的今天&#xff0c;商家对于商品信息的掌握和管理显得尤为重要。作为电商平台的佼佼者&#xff0c;京东&#xff08;JD&#xff09;提供了丰富的API接口&#xff0c;使得商家能够轻松地获取商品的详细信息&#xff0c;包括SKU&#xff08;Stock Keeping Unit…

2024五一数学建模A题思路代码与论文分析

2024五一数学建模A题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# 2024五一数学建模A题钢板最优切割路径问题需要建立的模型和算法: 图论 最短路径算法(Dijkstra算法、Floyd算法等) 动态规划 网格化离散建模 …

【USB 3.2 Type-C】 端口实施挑战的集成解决方案 (补充一)

USB 3.2 Type-C 端口集成 补充&#xff0c;上一篇感觉还有没理解到位的一部分&#xff1b; 一、只做正反插的通信&#xff0c;已经差不多够了&#xff0c;但是这并不是完整的TYPE-C,必须要补充上PD; 参考连接&#xff1a; TYPE-C PD浅谈&#xff08;一&#xff09;https://w…

删除链表中等于给定值 val 的所有结点(三种方法深入解析)

又见面啦&#xff0c;接下来的链表相关Oj题目我会根据我自己的理解来给大家讲解&#xff0c;包括解析和代码&#xff0c;希望你可以对链表有更加深入的理解&#xff01;&#xff01; 题目&#xff1a; 先上链接&#xff1a; OJ题目 给你一个链表的头节点 head 和一个整数 va…

软件工程毕业设计选题100例

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…