阅读 《大规模并行处理器程序设计》影印版心得 第五章 CUDA Memories

本文主要是介绍阅读 《大规模并行处理器程序设计》影印版心得 第五章 CUDA Memories,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

主要意图是:global memory太慢(几百个时钟周期),带宽太小。我们编程时,应该努力少用global memory,而更多使用shared memory和constant memory等快速memory

 

 

5.1 Importance of Memory Access Efficiency

 

CGMA 刻画做一次浮点运算需要做几次global memory访问,此值越大越好,越大说明平均一次浮点运算所涉及的global memory越少。

 

换句话说,global memory访问是有带宽的,此带宽限制了浮点运算所能达到的峰值。如果每做一次浮点运算,就访问一次global memory,则限制了系统的运算效率,即global memory的带宽就是系统的峰值运算速率的极限。

 

5.2 CUDA Device Memory Types

 

constant memory: 低延迟,高带宽,只读存储器 (对device而言),读写存储器(对host而言)。但是有条件:所有threads同时访问同一块区域时,才能达到低延迟高带宽的效果。必须在所有函数之外声明,作用域是整个应用。所有的grid和所有的thread看到的都是同一个变量。通常用来存储thread的输入数据。当前,一般最大大小为64kB

 

Register: 局部于一个thread,只能线程自己访问。一般是频繁使用的局部变量用这个方式存储

 

shared memory: 一个block中的所有threads共享的内存,低延迟,高带宽。合理使用的话,可以提升性能。

 

在kernel中声明的自动标量,一般都存放在register中;向量对象一般都存放在global memory中。

 

注意:通常情况下,指针只能指向global momory中的变量;或者指针的值只能是global memory中的变量的地址。

 

 

5.3 A Strategy for Reducing Global Memory Traffic

 

这部分比较难理解,尤其是细节。 不过基本的思路还是比较清楚的。回顾一下矩阵乘法的几个例子来看一下优化的过程:第一个例子就是简单地使用多个GPU线程来实现矩阵乘法的并行化,每个线程从M矩阵取一行,N矩阵取一列,完成点积运算,求出目标矩阵的一个元素;第二个例子,通过引入更多的block,实现了更多的线程参与运算,每个block完成目标矩阵中一个tile的元素的乘法计算, 以满足更大的矩阵的乘法;第三个就是这个,目标是减少对global memory内存的访问次数,对系统进行优化。主要思路是根据shared memory的大小,每次把矩阵乘法的一部分输入数据装入shared memory,完成部分点积运算,结果存储到Pvalue中。经过若干个phases,把所有部分点积运算的结果都累加到Pvalue中,就求出了目标矩阵中某元素的值。具体可以参看图5.5

 

 

5.4 Memory As a Limiting Factor to Parallelism

 

本小节说明寄存器和shared memory等内存容量有限,使用时需要注意不能超出容量。

 

 

这篇关于阅读 《大规模并行处理器程序设计》影印版心得 第五章 CUDA Memories的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194224

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

【阅读文献】一个使用大语言模型的端到端语音概要

摘要 ssum框架(Speech Summarization)为了 从说话人的语音提出对应的文本二题出。 ssum面临的挑战: 控制长语音的输入捕捉 the intricate cross-mdoel mapping 在长语音输入和短文本之间。 ssum端到端模型框架 使用 Q-Former 作为 语音和文本的中介连接 ,并且使用LLMs去从语音特征正确地产生文本。 采取 multi-st

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。 本文分析这个问题和提供解决方案,供大家参考。 问题分析——找不到ONNX Runtime GPU 动态库 首先直接运行python程序

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

React第五章(swc)

swc 什么是swc? SWC 既可用于编译,也可用于打包。对于编译,它使用现代 JavaScript 功能获取 JavaScript / TypeScript 文件并输出所有主流浏览器支持的有效代码。 SWC在单线程上比 Babel 快 20 倍,在四核上快 70 倍。 简单点来说swc实现了和babel一样的功能,但是它比babel快。 FAQ为什么快? 编译型 Rust 是

处理List采用并行流处理时,通过ForkJoinPool来控制并行度失控的问题

在使用parallelStream进行处理list时,如不指定线程池,默认的并行度采用cpu核数进行并行,这里采用ForJoinPool来控制,但循环中使用了redis获取key时,出现失控。具体上代码。 @RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@Slf4jpublic class Fo