GPU加速专栏
文章平均质量分 70
介绍 CUDA,GPU Acceleration, LLVM知识;其中CUDA部分内容是 《Programming Massively Parallel Processors 4th》 英文版学习笔记,边学边记,温故知新。如有侵权请联系删除。
黑不溜秋的
GPU全栈博主-程序哥。
展开
-
CUDA编程08 - 并行编程思维
到目前为止,我们集中于学习并行编程的实用知识,包括CUDA编程接口特性、GPU架构、性能优化技术、并行模式和应用案例研究。在本章中,我们将讨论更为抽象的概念。我们将并行编程概括为一种思维过程,即设计或选择并行算法,并将一个实际问题分解基本的工作单元,这些工作单元可以由所选的算法高效地执行。具备强大思维技能的程序员不仅会分析问题,还会转变实际问题的结构:哪些部分本质上是串行的,哪些部分适合并行执行,以及将前者的部分转移到后者所涉及的一些权衡。原创 2024-09-02 23:14:47 · 1213 阅读 · 0 评论 -
CUDA编程07 - 卷积的优化
在接下来的几篇文章中,我们将讨论一组重要的并行计算模式。这些模式是许多并行算法的基础,这些算法出现在许多并行应用中。我们将从卷积开始,卷积是一种流行的数组操作,广泛应用于信号处理、数字录音、图像处理、视频处理和计算机视觉等领域。在这些应用领域中,卷积通常作为一种滤波器,转化信号和像素为更理想的值。我们的图像模糊核就是这样一种滤波器,它平滑信号值,以便人们能够看到整体趋势。另一个例子是高斯滤波器,这是一种卷积滤波器,可以用来锐化图像中物体的边界和边缘。卷积通常执行大量的算术运算,以生成每个输出元素。原创 2024-08-19 00:27:37 · 797 阅读 · 0 评论 -
CUDA编程06 - 性能优化指南
并行程序的执行速度在很大程度上取决于程序的资源需求与硬件的资源限制。在几乎所有并行编程模型中,管控并行代码与硬件资源约束之间的相互影响对于实现高性能非常重要的。这是一种实用的技能,需要对硬件体系结构有深刻理解,并需要在为高性能设计的并行编程模型下不断练习。到目前为止,我们已经了解了GPU架构的各个方面及其对性能的影响。在前面的CUDA编程04 - GPU计算架构和线程调度。原创 2024-08-12 01:01:56 · 1191 阅读 · 0 评论 -
CUDA编程05 - GPU内存架构和数据局部性
到目前为止,我们已经学会了如何编写 CUDA 核函数,以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构,以及线程在硬件上调度执行过程。在本章中,我们将重点关注 GPU 的片上(on-chip)内存架构,并研究如何组织和存放数据,以便这些数据能够被大量线程高效的访问。到目前为止,我们所学习的 CUDA 核函数可能只达到底层硬件性能的一小部分。之所以性能不佳,是因为通常使用片外(off-chip)内存,即全局内存。原创 2024-08-07 21:07:29 · 745 阅读 · 0 评论 -
CUDA编程04 - GPU计算架构和线程调度
在前面的CUDA编程01- 并行编程介绍中,我们了解到CPU的设计目的是最小化指令执行的延迟,而GPU的设计目的是最大化执行指令的吞吐量。在前面CUDA编程02 - 数据并行介绍和CUDA编程03 - 多维数据并行中,我们学习了使用CUDA编程接口创建和调用核函数来启动和执行线程的核心特性。在接下来的三篇文章中,我们将讨论现代GPU的架构,包括计算架构和内存架构,并探讨基于架构理解之上的性能优化技术。本章将介绍GPU计算架构的几个方面,这些方面对于CUDA C程序员理解其核函数的性能和行为至关重要。原创 2024-08-01 22:19:41 · 1716 阅读 · 1 评论 -
CUDA编程03 - 多维数据并行
本文将更全面地讨论线程的组织方式,并学习如何使用线程和线程块来处理多维数据。本文将使用多个示例,包括将彩色图像转换为灰度图像、模糊图像以及矩阵乘法。这些示例旨在让读者熟悉数据并行的编程方法,以便在接下来的文章中讨论GPU架构、内存结构和性能优化。原创 2024-07-28 17:07:09 · 707 阅读 · 0 评论 -
CUDA编程02 - 数据并行介绍
数据并行是指在数据集的不同部分上执行计算工作,这些计算工作彼此相互独立且可以并行执行。许多应用程序都具有丰富的数据并行性,使其能够改造成可并行执行的程序。因此,对于程序员来说,熟悉数据并行的概念以及使用并行编程语言来编写数据并行的代码是非常重要的。在本文中,我们将使用CUDA C语言构造开发一个简单的数据并行程序。原创 2024-07-23 08:26:38 · 921 阅读 · 0 评论 -
CUDA编程01- 并行编程介绍
自计算机诞生以来,许多高端应用程序对执行速度和资源的需求超出了计算机所能提供的能力范围。早期的应用依赖于处理器速度、存储速度、存储容量的提升来增强应用程序的能力,例如,天气预报的及时性、工程结构分析的准确性、计算机生成图形的逼真度、每秒处理的机票预订数量,以及每秒处理的资金转账数量。最近,深度学习等新应用对执行速度和资源的要求甚至超过了最好的计算能力。这些应用需求在过去的五十年里推动了计算设备能力的快速发展,并将在可预见的未来继续如此。原创 2024-07-17 00:57:19 · 2225 阅读 · 0 评论 -
CUDA编程00 - 配置CUDA开发环境
第一步:在一台装有Nvidia显卡和驱动的机器上,用nvidia-smi命令查看显卡所支持cuda版本。安装时按提示下一步即可,安装完成用 nvcc -V 命令检查是否成功。第二步: 到Nvidia官网下载CUDA Toolkit并安装,第三步:编写HelloWorld。原创 2024-07-17 01:30:32 · 700 阅读 · 0 评论 -
LLVM - 编译器前端-llvm:IRBuilder 介绍
是 LLVM 中的一个重要类,用于方便地构建 LLVM 中间表示(IR)。它提供了一种高层次的接口,使得生成和操作 IR 更加简洁和高效。通过使用IRBuilder,开发者可以轻松地创建基本块、指令、函数等,而不需要直接操作低级别的 LLVM API。指令生成IRBuilder提供了一系列方法,用于生成各种类型的指令,如算术运算、逻辑运算、控制流指令(如条件分支、跳转等)和内存操作(如加载和存储)。上下文管理它与关联,确保所有生成的 IR 都在同一个上下文中,这对于内存管理和类型一致性至关重要。原创 2024-10-28 00:02:42 · 407 阅读 · 0 评论 -
LLVM - 编译器前端-llvm 基本块、指令、函数 的关系
在 LLVM 中,基本块、指令和函数是构建中间表示(IR)的核心概念,它们之间有着紧密的关系,首先了解下基本概念。原创 2024-10-28 00:02:35 · 598 阅读 · 0 评论 -
LLVM - 编译器后端-指令选择
任何后端的核心都是指令选择。LLVM 实现了几种方法;在本篇文章中,我们将通过选择有向无环图(DAG)和全局指令选择来实现指令选择。在本篇文章中,我们将学习以下主题:• 定义调用约定的规则:本节展示如何在目标描述中设置调用约定的规则。• 通过选择 DAG 进行指令选择:本节介绍如何使用图数据结构实现指令选择。• 添加寄存器和指令信息:本节解释如何访问目标描述中的信息,以及一些额外提供的信息。• 设置堆栈空间:本节介绍堆栈布局和函数调用栈。原创 2024-08-19 00:18:05 · 1111 阅读 · 0 评论 -
LLVM - 编译器后端-目标描述
LLVM具有非常灵活的架构。我们可以向其添加新的目标后端。后端的核心是目标描述。在本篇文章中,我们将学习如何在LLVM中添加一个CPU后端。在本章中,我们将涵盖以下内容:• 为新的后端搭建环境,学习M88k CPU架构,并介绍从哪里可以找到所需的信息。• 将新架构添加到Triple类中,学习如何让LLVM识别新的CPU架构。• 扩展LLVM中的ELF文件格式定义,向处理ELF目标文件的库和工具添加对M88k特有重定位的支持。原创 2024-08-16 00:21:05 · 1391 阅读 · 0 评论 -
LLVM - 开发环境搭建-在Windows和Linux上编译安装LLVM_17.0.1
在Windows和Linux上编译安装LLVM原创 2024-03-22 20:44:30 · 572 阅读 · 0 评论 -
LLVM - 编译器结构
【代码】LLVM-编译器结构。原创 2024-07-02 20:47:53 · 206 阅读 · 0 评论 -
LLM- Transformer模型
2. 按层级划分来看一下Transform模型,首先是第一层,如下图红色部分圈出的,它是一个输入层,输入层输入一个正常的文本序列,切分称一个个小的单元(token),然后每个token通过Embedding可转换称向量表示,然后再加上一个token的位置信息,传送给上一层。3. 接下来是Transfrom模型的第二层,它是由多个encoder block 和decorder block 堆叠而成,通过这样一个多层block的堆叠,Transform成为一个更深表达能力更强的模型。原创 2024-07-10 23:14:39 · 239 阅读 · 0 评论 -
LLM- 注意力机制
(1):RNN模型[RNN模型]的缺点:下图是例如RNN模型解决机器翻译的例子,从这个例子可以看到Encoder最后一个向量(eos)送给了Decoder端,因为Decoder端要输出一个完整的正确的句子,这就要求Encoder端的最后一个向量(eos)表示要包含这个句子的完整信息。但是这样一个向量能够表达句子中所有信息吗,答案是否定的,由于向量容量的限制,向量包含的信息是有限的。会显著限制RNN模型Encoder端的信息表达,这就是RNN有信息瓶颈的问题。原创 2024-07-09 01:05:52 · 487 阅读 · 0 评论 -
LLM - 卷积神经网络(CNN)
(2)卷积操作,有一个卷积核(m*m大小的),在输入矩阵进行滑动,每次计算一个卷积结果(结果是标量,即一个特征值),如下图所示,当在卷积窗口滑动完成时,会得到一个特征向量。(3)然后进入池化层,对特征向量进一步提取,一般是提取局部最大值(max pooling)或局部均值(average pooling)(1)首先进入输入层,对数据数据进行处理,将输入数据向量化处理,最终形成输入矩阵。(2)接着进入卷积层,根据不同卷积核来对输入数据进行卷积操作,得到特征向量。(2)CNN共享模型参数(卷积核)原创 2024-07-06 09:49:17 · 396 阅读 · 0 评论 -
LLM - 循环神经网络(RNN)
输入层的[x1, x2,x3]是序列数据,隐藏层[h0, h1, h2, h3]存储着过去一段时间和当前的一些状态信息(说明是有记忆的),输出层[y1, y2, y3], y1 是由上一个的状态h0 和 当前状态h1的计算结果。(4)计算h4,因为h4包含了前面h1,h2,h3所有词的信息,所以h4的值更符合句子语义。(2)随着序列不断向后推移,由于记忆步长的限制,后面的计算很难依赖更之前的状态,如下图,越往后计算梯度时链式越长,这会导致梯度消失或梯度爆炸。(1):词性标注,给定一句话,预测每个词的词性。原创 2024-07-06 08:42:22 · 676 阅读 · 0 评论 -
LLM - 词向量 Word2vec
在这个窗口中最中间的词叫做目标词(Target), 其他的词称为上下文词(Context)。(2)其次用这两个onehot向量在最终要训练的词向量矩阵中,找到never,late对应的词向量。(3)根据目标词(Target)预测上下文词(Context)的神经网络模型叫做Skip-Gram模型。(2)根据上下文词(Context)预测目标词(Target)的神经网络模型叫做CBOW模型。1. 词向量是一个词的低维表示,词向量可以反应语言的一些规律,词意相近的词向量之间近乎于平行。原创 2024-07-05 23:19:26 · 459 阅读 · 0 评论 -
LLM - 神经网络的训练过程
3. 最小化损失函数的方法(梯度下降法),即将优化步骤拆分成若干个步骤,每次对损失函数的值做小幅缩小,具体过程是对损失函数求该模型参数的梯度,每次迭代对向着梯度变化最快的方向前进一步(这样就可以计算出模型参数,并在此轮迭代后更新模型参数),这样就可以使损失函数值降低一点,每次前进一步的步长称为学习率。1. 对于回归问题,用损失函数来计算预测值和真实值的差异,一种常用的公式是如下图所示(Mean Square Error),如果损失函数的值越小说明神经网络学习越准确,所以神经网络训练目标是减小损失函数的值,原创 2024-07-05 22:28:38 · 786 阅读 · 0 评论 -
LLM - 神经网络的组成
计算方式是输入向量X,在权重矩阵W和偏置向量B的作用下,经过激活函数,产生n个输出(输出是一个向量)4. 为什么要引入激活函数?因为如果不引入激活函数,多层神经网络会塌缩成一层神经网络,如下图示意,神经网络每层都是线性变换,最终多层网络的结果只相当于一层网络。1. 一个神经元的结构:即接受多个输入X向量,在一个权重向量W和一个偏执标量b的作用下,经过激活函数后,产生一个输出。3. 多次神经网络的结构:由输入层,隐层,输出层组成,每一层的输出结构是由上一层的线性变换和激活函数得到。5. 激活函数有哪些?原创 2024-07-05 21:39:16 · 618 阅读 · 0 评论 -
LLM - 词表示和语言模型
(6):Neural Language Model , 比如要预测下一个词出现的概率,就要对前文出现的词表示成向量, 把向量拼成一起形成一个上下文向量,然后经过一个非线性转换,然后就可以用这个向量预测下一个词到底是什么。(4): 语言模型,一个句子联合的概率等于它里面的每个词基于它前面出现词的条件概率乘积。(2): 根据一个已经生成的词的序列,判断是合法句子的概率。(2): 把每个词表示一个独立的符号(one hot)(1): 根据前面的词序列,预测下一个词出现的概率。一. 词的相似度表示。原创 2024-07-04 21:36:00 · 477 阅读 · 0 评论 -
LLM - 模型历史
原创 2024-07-04 22:02:30 · 230 阅读 · 0 评论