- 博客(89)
- 收藏
- 关注
原创 优化矩阵转置总结
在CUDA中优化矩阵转置_cuda 矩阵转置-优快云博客矩阵转置优化CUDA内存管理本文档讨论了CUDA应用程序性能的各个方面,这些方面与有效使用GPU内存和应用于矩阵转置的数据管理有关。主机和设备之间的数据传输,以及常量和纹理存储器。这里没有讨论高效内存使用的其他方面,例如合并和分区冲突都处理全局设备和片上内存之间的数据传输,而共享内存库冲突处理片上共享内存。读者应该熟悉基本的CUDA编程概念,如内核、线程和块,以及对CUDA线程可访问的不同内存空间的基本理解。_cuda 矩阵转置。
2025-03-24 14:28:52
828
原创 GEMM优化计算流程
来源:https://zhuanlan.zhihu.com/p/442930482https://zhuanlan.zhihu.com/p/442930482前言:gemm优化思想(已完结)_gemm优化算法-优快云博客文章浏览阅读873次,点赞22次,收藏28次。来源参考:深入浅出GPU优化系列:GEMM优化(一)-知乎深入浅出GPU优化系列:GEMM优化(二)-知乎深入浅出GPU优化系列:GEMM优化(三)-知乎。_gemm优化算法https://blog.youkuaiyun.com/qq_62
2025-01-15 22:12:39
983
原创 GEMM优化代码实现1
每个输出矩阵 C[i,j]的元素是通过对 A 的一行和 B 的一列执行乘法和加法操作得到的。对于矩阵C中的每个元素C[i,j],需要进行 K 次乘法和 K−1 次加法。因此,每个C[i,j] 需要 2K−1次浮点运算。GFLOP(每秒十亿次浮点运算)用于衡量你在GPU上执行矩阵乘法操作(GEMM)的性能。你的代码通过计算矩阵乘法的总时间,并结合矩阵乘法所需的浮点运算数来计算GFLOP。计算的是进行一次矩阵乘法时所需的浮点运算次数。这将计算出每秒钟的浮点运算数(GFLOP/s)。
2024-12-23 13:42:19
497
原创 reduce优化总结
深入浅出GPU优化系列:reduce优化 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/426978026reduce优化-优快云博客https://blog.youkuaiyun.com/qq_62704693/article/details/142904830?spm=1001.2014.3001.5502 reduce优化2-优快云博客https://blog.youkuaiyun.com/qq_62704693/article/details/143207424?spm=10
2024-11-06 23:26:55
1114
原创 gemm优化思想(已完结)
来源参考:深入浅出GPU优化系列:GEMM优化(一) - 知乎深入浅出GPU优化系列:GEMM优化(二) - 知乎深入浅出GPU优化系列:GEMM优化(三) - 知乎。
2024-11-03 23:30:01
1083
原创 8. 性能指标
因此,要准确测量特定调用或 CUDA 调用序列的运行时间,有必要在启动和停止 CPU 计时器之前立即调用,使 CPU 线程与 GPU 同步。与禁用 ECC 的同一 GPU 相比,为每个内存事务获取 ECC 位也会将有效带宽减少约 20%,但 ECC 对带宽的确切影响可能更高,并且取决于内存访问模式。当设备到达流中的事件时,设备将记录事件的时间戳。实际内存吞吐量显示代码与硬件限制的接近程度,并且将有效带宽或请求带宽与实际带宽进行比较,可以很好地估计内存访问的次优合并所浪费的带宽量(请参阅 对。
2024-10-30 20:48:37
1039
原创 连续访问内存
在CUDA编程中,确保连续的线程访问连续的内存地址是实现高效内存访问的关键。这种访问模式可以提高内存带宽的利用率,因为现代GPU的内存系统对连续的访问模式进行了优化。
2024-10-30 20:30:50
385
原创 5. 性能指南
对于并行工作负载,在算法中由于某些线程需要同步才能相互共享数据而导致并行性中断的点,有两种情况:这些线程属于同一个块,在这种情况下,它们应该通过同一内核调用中的共享内存使用和共享数据, 或者它们属于不同的块,在这种情况下,它们必须使用两个单独的内核调用通过全局内存共享数据,一个用于写入全局内存,一个用于读取全局内存。当 warp 执行访问全局内存的指令时,它会根据每个线程访问的字的大小和内存地址在线程之间的分布,将 warp 中线程的内存访问合并到一个或多个这些内存事务中。因此,建议进行实验。
2024-10-30 00:26:39
795
原创 4. 硬件实现
使用独立线程调度,GPU 可以维护每个线程的执行状态,包括程序计数器和调用堆栈,并且可以在每个线程的粒度上产生执行,以更好地利用执行资源或允许一个线程等待另一个线程生成数据。如果 warp 的线程通过数据依赖的条件分支发散,则 warp 将执行所采用的每个分支路径,从而禁用不在该路径上的线程。线程处于非活动状态的原因有很多,包括比其 warp 的其他线程更早退出,采用的分支路径与 warp 当前执行的分支路径不同,或者是线程数不是 warp 大小的倍数的块的最后一个线程。为一组创建、管理、调度和执行线程。
2024-10-29 23:43:57
762
原创 3.2.4. 共享内存
这些乘积中的每一个都是通过以下方式执行的:首先将两个相应的方阵从全局内存加载到共享内存,一个线程加载每个矩阵的一个元素,然后让每个线程计算乘积的一个元素。每个线程将这些产品的结果累积到一个 register 中,完成后将结果写入全局内存。它可以用作暂存器内存(或软件管理的缓存),以最大限度地减少来自 CUDA 块的全局内存访问,如下面的矩阵乘法示例所示。通过以这种方式阻止计算,我们利用了快速共享内存并节省了大量的全局内存带宽,因为。以下代码示例是不利用共享内存的矩阵乘法的简单实现。仅从全局内存中读取 (
2024-10-29 21:53:20
1183
转载 int类型在内存中的存储方式
因此我们看到32位系统下int类型的取值范围中,负数部分比正数部分多了一个数字,正数的最大取值是2^31-1,而负数的最小取值是-2^31。正数部分之所以要减去1,是因为被数字0占用了,而负数部分不需要用来表示0,因此原本的“-0”就用来表示-2^31这个数字。实际上,在32位系统下int类型中,我们计算机已经强行规定了这种情况,数字0采用“+0”的表示方法,即00000000 00000000 00000000;按照上面提到的符号,我们有了两种0的表示方法,即“+0”和“-0”。
2024-10-24 23:32:07
370
转载 大数吃小数
对于大数吃小数问题的解决思路不外乎就是使用更高精度的数据类型、尽量避免较大数和较小数直接相加,或者通过补偿的方法。倍及以上时,较小数为了将指数位向较大的数对齐,有效位就会右移很多位,右移超过了 23 位,则会消失掉。0.5 的指数位为 -1,0.125 的指数位为 -3。Kahan 求和算法的思想:保存较大数和较小数相加过程中,较小数丢失的有效数字,然后补偿回来。从上面浮点数相加的过程,我们知道,由于浮点数有效位是 23 位,当较大数是较小数的。分段求和思想的本质就是避免较大数和较小数直接相加。
2024-10-24 21:57:49
119
原创 double与float那点事
C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,float和double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
2024-10-24 17:50:43
1240
转载 SM详解与Warp Scheduler
GPU利用率是指GPU资源的占用情况,其中SM是GPU中的可独立计算单元,将计算任务分解成多个小部分的工作分配给不同的SM并行执行,从而加快计算速度。,因为资源限制,SM要为每个线程块分配共享内存,而也要为每个线程束中的线程分配独立的寄存器,所以SM的配置会影响其所支持的线程块和warp并发数量。由于硬件和调度在使用中资源的限制,是的一个SM中可执行的线程块的数量有限,此外还应保证一个grid应该需要有足够多的线程块。因此,合理设计线程块和warp的数量是非常重要的,才能充分利用GPU资源,提高计算性能。
2024-10-11 23:38:09
253
1
原创 面向GPU计算平台的归约算法的性能优化研究
图3-2为改进后的归约算法示意图。首先从硬件资源组织上分析,每一个wavefront由64个线程组成(warp由32个线程组成),wavefront是GPU调度与执行的基本单位,wavefront内所有线程均执行相同的指令,由此可知,在work-group内归约中的for循环中,当运行线程数小于或等于64时,即运行线程都属于同一个wavefront时,可以省去显式的本地同步操作以提升算法性能。然后对每个块进行局部归约操作,求出块内的局部归约结果,最后再对局部归约结果进行全局归约操作,得到最终归约结果。
2024-09-02 18:49:30
1261
1
原创 Shared memory bank conflicts
这就像电影院的座位一样:一列的座位就相当于一个bank,所以每行有32个座位,在每个座位上可以“坐”一个32-bits的数据(或者多个小于32-bits的数据,如4个 char 型的数据,2个 short型的数据, 1 个 Uint32 数据);所有的线程都访问了同一个bank,貌似产生了32路的bank冲突,但是由于广播(broadcast)机制, 当一个warp中的所有线程访问一个bank中的。当每个线程访问一个32-bits大小的数据类型的数据(如int,float)时,不会发生bank冲突。
2024-08-30 21:00:10
864
原创 在CUDA中优化矩阵转置
矩阵转置优化CUDA内存管理本文档讨论了CUDA应用程序性能的各个方面,这些方面与有效使用GPU内存和应用于矩阵转置的数据管理有关。主机和设备之间的数据传输,以及常量和纹理存储器。这里没有讨论高效内存使用的其他方面,例如合并和分区冲突都处理全局设备和片上内存之间的数据传输,而共享内存库冲突处理片上共享内存。读者应该熟悉基本的CUDA编程概念,如内核、线程和块,以及对CUDA线程可访问的不同内存空间的基本理解。
2024-08-20 18:51:32
1468
原创 CUDA C++ 最佳实践指南
CUDA C++ 最佳实践指南 (nvidia.com)2. 异构计算CUDA C++ 最佳实践指南 (nvidia.com)2. 异构计算CUDA 编程涉及在两个不同的平台上同时运行代码:具有一个或多个 CPU 的主机系统和一个或多个支持 CUDA 的 NVIDIA GPU设备。虽然 NVIDIA GPU 经常与图形相关联,但它们也是强大的算术引擎,能够并行运行数千个轻量级线程。此功能使它们非常适合可以利用并行执行的计算。
2024-08-20 11:33:21
1584
原创 CUDA C++ 编程指南学习
CUDA C++ 编程指南 (nvidia.com)2. 编程模型2.1. 内核CUDA C++ 扩展了 C++,允许程序员定义 C++ 函数,称为内核,当被调用时,N 个不同的CUDA 线程并行执行 N 次,而不是像常规 C++ 函数那样只执行一次。内核是使用声明说明符定义的,对于给定的内核调用执行该内核的 CUDA 线程数是使用新的执行配置语法指定的(请参阅每个执行内核的线程都被赋予一个唯一的线程 ID,可以通过内置变量在内核内访问该 ID。
2024-08-15 19:57:38
1602
原创 我的第一个CUDA程序
矩阵A、B、C都为NxN的方阵,A和B为已知矩阵,C[i][j] = A[i][j] + B[j][i]。使用 CUDA GPU Timers 实际要循环100次求平均值。使用 CPU Timers 实际要循环100次求平均值。MatAdd算法的GPU实现。实现两个矩阵对应元素相加。
2024-08-14 19:56:53
1177
2
原创 GPU编程初探
(Graphic Processing Unit),图像处理处理器,俗称显卡,主要处理图像、显示等任务(数据运算逻辑运算(General Purpose computing on Graphic Processing Unit ),通用GPU,主要处理通用计算任务。核心数GPU显存容量GPU计算峰值显存带宽GPU不能单独计算,CPU+GPU组成异构计算架构;CPU起到控制作用,一般称为主机(Host);GPU可以看作CPU的协处理器,一般称为设备(Device);
2024-08-14 17:35:58
1309
原创 【算法笔记自学】第 11 章 提高篇(5)——动态规划专题
int n;i < n;i < n;int n, m;i < n;j++) {// 初始化第一行和第一列的dp值i < n;j++) {// 状态转移方程i < n;int n;i < n;
2024-07-13 21:47:33
409
原创 【算法学习】搜索算法之深度优先搜索
深度优先搜索(DFS)算法是一种用于遍历或搜索树或图的算法。它的基本思想是尽可能深地搜索图的分支,直到到达叶节点或无法再深入为止,然后回溯到前一个节点,继续探索其他分支。这种搜索策略可以确保图中的每个节点都被访问到,除非它是一个环。深度优先搜索的实现通常使用递归或栈来实现。对于树或图的遍历,可以从根节点或任意节点开始,然后沿着某个分支深入搜索,直到达到叶节点或无法再深入为止。在这个过程中,需要记录已经访问过的节点,以避免重复访问。当一条路径搜索完成后,需要回溯到上一个节点,继续搜索其他分支。
2024-02-20 23:09:39
1192
原创 【基础数据结构】二叉树的遍历
力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台。是指没有子节点的节点。方法一:深度优先搜索。
2024-01-18 12:55:02
859
原创 【基础数据结构】二叉树的基本性质
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如果二叉树每个节点都具有相同的值,那么该二叉树就是。,编写一个函数来检验这两棵树是否相同。只有给定的树是单值二叉树时,才返回。编译环境Dev-cpp(C++)编译环境Dev-cpp(C++)编译环境Dev-cpp(C++)给你两棵二叉树的根节点。给你一个二叉树的根节点。, 检查它是否轴对称。
2024-01-17 23:04:45
557
原创 【CSP】2023年12月真题练习(更新到202312-2)
例如,“动物”是“生物”的次级类别,“鱼类”是“动物”的次级类别,“鸟类”是“动物”的次级类别,“鱼类”和“鸟类”是“动物”下的邻居类别。例如,要确定“猫”的类别,系统可以向用户提出“猫是否属于动物”,当用户选择“是”时,系统会进一步分别询问“猫”是否属于“鱼类”和“鸟类”,当两个问题收到了否定的答案后,系统会确定“猫”的类别是“动物”。剩下的类别有 3、4,分别计算。由于类别 5 不属于类别 2 的后代类别,因此用户回答“否”,此时去除类别 2 和其全部后代类别,仅保留类别 1、3、4、5。
2024-01-16 21:46:17
2363
2
吉林大学虚拟现实游戏程序设计作业
2024-06-27
吉林大学数据库系统应用开发期末大作业
2024-02-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人