![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CUDA入门
文章平均质量分 88
首先介绍 CUDA 基本的存储器和线程模型、CUDA 对 C 语言的拓展和基本的编程调试工具。接着介绍高性能计算中必要的并行模式。最后十节涵盖计算思想、各种并行执行模型和并行编程规则。
进击的博仔
冻它三尺冰
展开
-
归约求和算法(三)
本文使用一种循环调用kernel的方法对块内归约的结果进行求和,直接从kernel输出最终结果。而且每个线程都执行运算,能处理的元素数是原来算法的两倍。原创 2022-07-18 17:32:31 · 689 阅读 · 1 评论 -
NVIDIA CUDA 高度并行处理器编程(四):性能优化习题
优化后的归约与矩阵乘法算法,以及分块矩阵的内存连续访问证明原创 2022-07-18 15:10:45 · 447 阅读 · 1 评论 -
NVIDIA CUDA 高度并行处理器编程(九):并行模式:稀疏矩阵-向量乘法
CUDA 稀疏矩阵向量乘法。原创 2022-07-10 15:08:31 · 2164 阅读 · 1 评论 -
NVIDIA CUDA 高度并行处理器编程(八):并行模式:直方图计算
利用 CUDA 计算直方图,尽可能对算法进行优化。原创 2022-07-04 22:45:33 · 1027 阅读 · 11 评论 -
NVIDIA CUDA 高度并行处理器编程(七):并行模式:前缀和
CUDA前缀和计算。原创 2022-07-02 12:27:40 · 2114 阅读 · 21 评论 -
NVIDIA CUDA 高度并行处理器编程(六):并行模式:卷积
CUDA卷积。原创 2022-06-12 14:30:54 · 1924 阅读 · 4 评论 -
win11+MX250+CUDA Tookit 10.1 update 2
win11+MX250安装CUDA原创 2022-06-11 17:01:11 · 1087 阅读 · 2 评论 -
并行程序设计大作业——稀疏神经网络推理
神经网络前向传播优化:60000 * 1024 的矩阵 A 分别与 120 个1024*1024的稀疏矩阵 B [i]相乘。A 与 B[i] 相乘后用激活函数 relu 激活,激活后的 C 矩阵作为下一次的矩阵 A 。使传播时间尽可能短。原创 2022-06-10 01:05:15 · 1029 阅读 · 5 评论 -
NVIDIA CUDA 高度并行处理器编程(五):浮点运算
NVIDIA CUDA 高度并行处理器编程(五):浮点运算浮点格式M 的规范化表示E 的余码表示能表示的数特殊的位模式与 IEEE 格式中的精度算术运算的准确度和舍入算法的优化数值稳定性浮点格式在 IEEE-754 浮点标准中,一个数值由 3 部分组成:符号位(S)、阶码(E)和尾数(M)。除了某些例外,每个(S、E、M)模式根据下列格式可以标示一个唯一的数值:value=(−1)S×1.M×2E−biasvalue = (-1)^S \times 1.M \times {2^{E-bias}}val原创 2022-06-07 21:42:14 · 817 阅读 · 0 评论 -
NVIDIA CUDA 高度并行处理器编程(三):CUDA存储器习题
NVIDIA CUDA 高度并行处理器编程(三):CUDA存储器习题习题一中第一题,矩阵加法。可以使用共享存储器减少全局存储器对宽带的消耗吗?答:不可以,在每个线程计算一个的 kernel 函数中,每个线程只访问两个所需元素,且每个元素只被访问并加载一次。因为没有元素的重复访问,所以不能使用共享存储器减少全局存储器对宽带的消耗。对于分块矩阵乘法,证明全局存储器宽带的减少正比于块的维度大小。证明:不用分块的每个元素要加载 n 次,假设块维度 i,则每个块需要加载 n/i + 1 次。得证。原创 2022-05-21 22:13:10 · 701 阅读 · 0 评论 -
NVIDIA CUDA 高度并行处理器编程(二):数据并行执行习题
NVIDIA CUDA 高度并行处理器编程(二):数据并行执行习题如果一 CUDA 设备的一个 SM 能容纳 1536 个线程和 4 个线程块,下面那种线程块配置使得一个 SM 中能容纳最多的线程?a. 每个线程块 128 个线程b. 每个线程块 256 个线程c. 每个线程块 512 个线程d. 每个线程块 1024 个线程答:c, 一个 SM 容纳 3 个线程块,共 1536 个线程。向量加法中,假定向量长度是 2000, 每个线程产生一个输出元素,每个线程块包含 512 个线程。原创 2022-05-21 15:29:57 · 514 阅读 · 0 评论 -
NVIDIA CUDA 高度并行处理器编程(一):CUDA简介习题
NVIDIA CUDA 高度并行处理器编程(一):CUDA简介习题1. 矩阵加法接受两个矩阵 B 和 C 产生输出矩阵 A。输出矩阵 A 的每个元素是输入矩阵 B 和 C 相应元素之和,即 A[i][j] = B[i][j] + C[i][j]。方便起见只考虑方阵,元素都是单精度浮点值。写一个矩阵加法 kernel 函数和一个 stub 函数,可以用如下 4 个参数调用:指向输出矩阵的指针、指向第一个输入矩阵的指针、指向第二个输入矩阵的指针和每个维度上的元素个数。根据如下说明编写:主机存根函数为输入和原创 2022-05-09 15:02:17 · 673 阅读 · 2 评论 -
NVIDIA CUDA 高度并行处理器编程(四):CUDA性能优化
NVIDIA CUDA 高度并行处理器编程(四):CUDA性能优化1. WARP 和线程执行kernel 函数的执行速度在不同设备上差异很大,这是因为不同设备的资源约束不同。下面将会讨论资源约束的主要类型,以及它们如何限制 kernel 函数的执行性能。在特定设备上,可通过用一种资源代替另一种资源的方式来提高程序的性能。1. WARP 和线程执行(二)中写到,CUDA 设备将若干线程捆绑执行。把每个线程块划分成 warp。warp 的执行由 SIMD 硬件完成。线程块根据线程索引划分为 warp。当前原创 2022-05-20 16:14:59 · 2575 阅读 · 2 评论 -
CUDA 归约求和算法(二)
求和归约算法(二)上篇文章求和归约算法(一)中实现了并行归约求和,但是其中的 kernel 函数中明显有分支。同一个 warp 在全程循环中都有两个控制流路径,即一部分满足 if 条件参与运算,另一部分不满足 if 条件不参与运算。下面介绍一种尽量控制一个 warp 中只有一个控制流路径。从而使 warp 的工作效率最高的归约求和算法。结合下面的代码解释。第一轮循环中不在采用相邻元素相加,两个相加元素中间的距离是每一部分大小的一半。把 stride 初始化为线程块大小的一半,能实现上述操作。第原创 2022-05-17 10:12:23 · 519 阅读 · 5 评论 -
CUDA 归约求和算法(一)
CUDA 归约求和算法:并行归约(Reduction)是一种很基础的并行算法,简单来说,我们有N个输入数据,使用一个符合结合律的二元操作符作用其上,最终生成1个结果。这个二元操作符可以是求和、取最大、取最小、平方、逻辑与或等等。由于加法的交换律和结合律,数组可以以任意顺序求和。所以我们会自然而然产生这样的思路:首先把输入数组划分为更小的数据块,之后用一个线程计算一个数据块的部分和,最后把所有部分和再求和得出最终结果。上面演示了单个线程块内的归约求和过程,结合下面的代码解释:13行第一轮循环,对应原创 2022-05-16 23:57:54 · 3385 阅读 · 3 评论 -
NVIDIA CUDA 高度并行处理器编程(一):CUDA简介
nVIDIA CUDA 高度并行处理器编程(一):CUDA简介原创 2022-05-08 11:30:36 · 1897 阅读 · 0 评论 -
NVIDIA CUDA 高度并行处理器编程(三):CUDA存储器
NVIDIA CUDA 高度并行处理器编程(三):CUDA存储器前两节中写了如何编写调用大量线程来计算矩阵加法和乘法的 kernel 函数。但这些线程要处理的数据是先从全局储存器中访问,而全局储存器是通过 DRAM 来实现,访问速度慢,而且它的路径上容易发生拥塞现象,只允许很少线程继续访问,因此导致一些 SM 处于空闲状态。下面主要解决存储器的访问速度慢的问题。...原创 2022-05-13 23:55:42 · 411 阅读 · 0 评论 -
NVIDIA CUDA 高度并行处理器编程(二):数据并行执行模型
NVIDIA CUDA 高度并行处理器编程(二):数据并行执行模型1. CUDA的线程组织内置变量:内置变量的值一般都由运行时系统预初始化,例如 CUDA 的 kernel 函数中, gradDim,blockDim,blockIdx,threadIdx都是内置变量,它们的值由 CUDA 运行时系统预初始化,可以在 kernel 函数中引用。其他地方应避免使用这些变量。1. CUDA的线程组织上一节向量加法中的线程被组织成二级的层次结构:一个网络包含一个或更多的线程块,每块包含一个或更多的线程。一个块原创 2022-05-10 23:26:53 · 607 阅读 · 0 评论