CUDA
文章平均质量分 71
CUDA学习
我想静静,
这个作者很懒,什么都没留下…
展开
-
使用cutlass实现多种精度的GEMM,支持cuda core与tensor core
使用cutlass实现多种精度的GEMM,附有完整代码与cmakelist原创 2024-03-27 20:42:15 · 1169 阅读 · 0 评论 -
cuda在申请sharedmemory和原子操作时对fp16bf16等的支持
注意shared memory的申请和原子操作(计算能力大于8的支持bf16等,这里使用的是torch的gpuAtomicAdd)的问题。给pytorch写cuda算子时,需要支持多种数据类型,可以使用模板。原创 2023-07-02 16:37:26 · 497 阅读 · 0 评论 -
cuda性能分析工具
cuda性能分析工具原创 2023-02-14 17:02:25 · 2044 阅读 · 4 评论 -
cuda operator稀疏矩阵csr相乘
#include <iostream>#include<malloc.h>#include "cuda_runtime.h"#include <cusparse_v2.h>template<typename T>int csrmatrix_mul_csrmatrix(const int rows_num, const int nonzero_num_A, const int nonzero_num_B, T *c原创 2021-08-05 21:00:53 · 889 阅读 · 3 评论 -
cuda operator稀疏矩阵csr相加
https://docs.nvidia.com/cuda/cusparse/#cusparse-generic-function-spsm#include <iostream>#include<malloc.h>#include "cuda_runtime.h"#include <cusparse_v2.h>template<typename T>int csrmatrix_mul(const int rows_num, const int.原创 2021-08-05 19:54:58 · 345 阅读 · 3 评论 -
CUDA debug大法 GDB
在Cion上,没法进去CUDA kernel 调试,所以需要GDB。在clion的终端生成可调试文件 nvcc -g -G main.cu -o main运行文件cuda-gdb main回车开始start在53行设置断点b 53cc是continue查看变量值p val_num变换threadscuda thread (0,7,0)跳到threadsIdx.x=0, threadsIdx.y=7的线程...原创 2021-07-30 14:29:48 · 1359 阅读 · 0 评论 -
将cusparse、cublas加到CMakelist
cmake_minimum_required(VERSION 3.19)project(myCG CUDA)set(CMAKE_CUDA_STANDARD 14)enable_language(CXX CUDA)add_executable(myCG main.cu)find_package(CUDA)target_link_libraries( myCG ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY} )set_target_propert原创 2021-07-27 15:48:07 · 1170 阅读 · 0 评论 -
cuda工具
在终端运行nvvp点击file -> new session在file里选择可执行文件即可原创 2021-07-27 11:42:52 · 1443 阅读 · 0 评论 -
cuda知识点
1.每个线程块的最大线程数为1024原创 2021-06-15 20:28:16 · 190 阅读 · 0 评论 -
nvidia-smi Failed to initialize NVML: Driver
淦,cuda又不能用了,$ nvidia-smi Failed to initialize NVML: Driver之前是因为Ubuntu内核更新,所以报错,解决方法如下:https://blog.csdn.net/weixin_42764932/article/details/115111784?spm=1001.2014.3001.5501如果不是内核问题就重启,重启也不行,那就是NVIDIA 内核驱动版本与系统驱动不一致,方法如下1. 卸载驱动sudo apt-get purge nvi原创 2021-06-05 15:31:47 · 189 阅读 · 0 评论 -
CUDA编程练习
文章目录1. 设定GPU2. 简单的向量相加3. 简单的矩阵相加1. 设定GPU#define CHECK(call) \{ \ const cudaError_t error = call; \ if(error!=cudaSuccess) \ { \ printf("error: %s: %d, ", __FILE__, __LINE__); \ printf("code:%d原创 2021-04-12 22:27:21 · 514 阅读 · 0 评论 -
札记3
文章目录IoU手写IoU手写def iou(box1, box2):# box left right top bottom t_h = min(box1[3], box2[3]) - max(box1[2], box2[3]) t_w = min(box1[1], box2[1]) - max(box1[0], box2[0]) inter = 0 if t_h <0 or t_w <0 else t_h*t_w union = (box1[3] - box1[2])*(box1[原创 2021-04-09 20:35:08 · 84 阅读 · 0 评论 -
CUDA学习之流和并发--part2
文章目录6.3 重叠内核执行和数据传输6.3.1 使用深度优先调度重叠6.3.2 使用广度优先调度重叠6.4 重叠GPU和CPU执行6.5 流回调6.3 重叠内核执行和数据传输在本节中,将学习如何并发执行内核和数据传输。Fermi架构和Kepler架构下有两个复制引擎队列,也就是数据传输队列,一个从设备到主机,一个从主机到设备。所以读取和写入是不经过同一条队列的,这样的好处就是这两个操作可以重叠完成了,注意,只有方向不同的时候才能数据操作。同向的时候不能进行此操作。应用程序中,还需要检查数据传输和内原创 2021-04-07 15:13:50 · 260 阅读 · 0 评论 -
CUDA学习之流和并发--part1
文章目录6.1 流和事件概述6.1.1 CUDA流6.1.2 流调度1. 虚假的依赖关系2. Hyper-Q技术6.1.3 流的优先级CUDA事件1. 创建和销毁2. 记录事件和计算运行时间6.1.5 流同步1. 阻塞流和非阻塞流2. 隐式同步3. 显式同步4. 可配置事件6.2 并发内核执行6.2.1 非空流中的并发内核6.2.2 Fermi GPU 上的虚假依赖关系6.2.3 使用OpenMP的调度操作6.2.4 用环境变量调整流行为6.2.5 GPU资源的并发限制6.2.6 默认流的阻塞行为6.2.7原创 2021-04-07 13:46:00 · 1188 阅读 · 0 评论 -
CUDA学习之共享内存和常量内存--part3
文章目录5.4 合并的全局内存访问5.4.1 基准转置内核5.4.2 使用共享内存的矩阵转置5.4.3 使用填充共享内存的矩阵转置5.4.4 使用展开的矩阵转置5.4.5 增大并行性5.5 常量内存5.5.1 使用常量内存实现一维模板5.4 合并的全局内存访问转置只能在行读取列写入或者列读取行写入之间选择一个,这样就必然会引发非合并的访问;可以利用一级缓存的性质可以提高性能;本节利用共享内存,在共享内存中完成转置后写入全局内存,这样就可以避免交叉访问了。5.4.1 基准转置内核下界作为基准原创 2021-04-06 14:52:34 · 621 阅读 · 0 评论 -
CUDA学习之共享内存和常量内存--part2
文章目录5.2 共享内存的数据布局5.2.1 方形共享内存1. 行主序访问和列主序访问2. 按行主序写和按列主序读3. 动态共享内存4. 填充静态声明的共享内存5. 填充动态声明的共享内存6. 方形共享内存内核性能的比较5.2.2 矩形共享内存1. 行主序写操作和列主序读操作2. 动态声明的共享内存3. 填充静态声明的共享内存4. 填充动态声明的共享内存5. 矩形共享内存内核性能的比较5.3 减少全局内存访问1. 使用共享内存的并行归约2. ** 使用展开的并行归约3. 使用动态共享内存的并行归约4. 有效原创 2021-04-05 21:41:37 · 446 阅读 · 0 评论 -
CUDA学习之共享内存和常量内存--part1
文章目录5.1 CUDA共享内存概述5.1.1 共享内存SMEM5.1.2 共享内存分配5.1.3 共享内存存储体和访问模式1. 内存存储体2. 存储体冲突3. 访问模式4. 内存填充5. 访问模式配置5.1.4 配置共享内存量5.1.5 同步1. 弱排序内存模型2. 显式障碍3. 内存栅栏4. Volatile修饰符5. 共享内存与全局内存之前研究了全局内存的使用,如何通过不同的方式提高全局内存的访问效率。虽然未对其的内存访问是没有问题的,因为现代GPU都有一级缓存了。但是跨全局内存的非合并内存访问原创 2021-04-05 11:34:05 · 1077 阅读 · 0 评论 -
CUDA学习之全局内存--小结
文章目录提高带宽利用率的方法:最大化当前并发内存访问的次数1 使用展开技术在每个线程中创建更多的独立内存请求2 调整网格和线程块的执行配置最大化在总线上的全局内存和SM片上内存之间移动字节的利用率1 努力实现理想的访问模式:对齐和合并内存访问2 消除分区冲突: 对角坐标映射是一种通过调整块执行顺序来避免分区冲突的方法。提高带宽利用率的方法:最大化当前并发内存访问的次数可以隐藏内存延迟1 使用展开技术在每个线程中创建更多的独立内存请求2 调整网格和线程块的执行配置最大化在总线上的全局内存和原创 2021-04-04 16:43:16 · 157 阅读 · 0 评论 -
CUDA学习之全局内存--part2
文章目录4.3 内存访问模式4.3.1 对齐与合并访问读取粒度为何是32字节访问方式决定读取粒度对齐内存访问与合并内存访问4.3.2 全局内存读取内存加载访问模式1. 缓存加载(启用一级缓存)2. 没有缓存的加载 (禁用一级缓存)3. 非对齐读取示例禁用一级缓存对全局内存加载性能有何影响4. 只读缓存4.3.3 全局内存写入4.3.4 结构体数组与数组结构体AoS示例SoA示例4.3.5 性能调整展开技术增大并行性最大化带宽利用率4.4 核函数可达到的带宽4.4.1 内存带宽4.4.2 矩阵转置问题1. 为原创 2021-04-04 16:07:20 · 749 阅读 · 0 评论 -
CUDA学习之全局内存--part1
文章目录4.1 CUDA内存模型概述执行模型中,核的配置,决定了程序执行效率,但是程序的执行效率不只由线程束,线程块等执行结构决定,内存也严重的影响了性能。4.1 CUDA内存模型概述原创 2021-04-03 15:41:02 · 1154 阅读 · 0 评论 -
CUDA学习之CUDA执行模型--part5
文章目录3.6 动态并行3.6.1 嵌套执行3.6.2 在GPU上嵌套Hello World3.6.3 嵌套归约3.6 动态并行到目前为止,我们所有的内核都是在主机线程中调用的,是否我们可以在内核中调用内核,这个内核可以是别的内核,也可以是自己,那么我们就需要动态并行了,这个功能在早期的设备上是不支持的。CUDA的动态并行允许在GPU端直接创建和同步新的GPU内核。动态并行的好处之一就是能让复杂的内核变得有层次,坏处就是写出来的程序更复杂,因为并行行为本来就不好控制.有了动态并行,可以推迟到运行时原创 2021-04-02 21:37:57 · 283 阅读 · 0 评论 -
CUDA学习之CUDA执行模型--part4
文章目录3.4 避免分支分化3.4.1 并行归约问题3.4 避免分支分化有时,控制流依赖于线程索引。线程束中的条件执行可能引起线程束分化,这会导致内核性能变差。通过重新组织数据的获取模式,可以减少或避免线程束分化。在本节里,将会以并行归约为例,介绍避免分支分化的基本技术。3.4.1 并行归约问题...原创 2021-04-02 17:54:01 · 389 阅读 · 2 评论 -
CUDA学习之CUDA执行模型--part3
文章目录3.3 并行性的表现3.3.1 用nvprof检测活跃的线程束3.3.2 用nvprof检测内存操作内存读取效率全局加载效率3.3.3 增大并行性指标与性能3.3 并行性的表现为更好地理解线程束执行的本质,将使用不同的执行配置分析下述的sumMatrixOn-GPU2D核函数。使用nvprof配置指标,可以有助于理解为什么有些网格/块的维数组合比其他的组合更好。这些练习会提供网格和块的启发式算法,这是CUDA编程人员必备的技能。#include "../common/common.h"#i原创 2021-03-24 15:26:00 · 327 阅读 · 0 评论 -
CUDA学习之CUDA执行模型--part2
文章目录3.2 理解线程束执行的本质3.2.1 线程束和线程块3.2.2 线程束分化例3.2 理解线程束执行的本质启动内核时, 从软件的角度你看到了什么?对于你来说,在内核中似乎所有的线程都是并行地运行的。在逻辑上这是正确的,但从硬件的角度来看,不是所有线程在物理上都可以同时并行地执行。本章已经提到了把32个线程划分到一个执行单元中的概念:线程束。现在从硬件的角度来介绍线程束执行,并能够获得指导内核设计的方法。3.2.1 线程束和线程块线程束是SM中基本的执行单元,一个线程束由32个连续的线程组原创 2021-03-18 23:36:42 · 379 阅读 · 0 评论 -
解决 nvprof 报错ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device
做 CUDA 开发,用 nvprof 命令行分析性能时报错:==14973== Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device. See the following link for instructions to enable permissions and get more information: https://developer.nvidia.com/ERR原创 2021-03-18 22:17:51 · 2511 阅读 · 1 评论 -
CUDA学习之第三章:CUDA执行模型--part1
文章目录3.1 CUDA执行模型概述3.1.1 GPU架构概述SM流式多处理器线程束(warp)SIMT架构与SIMD架构:CUDA编程对应的组件3.1.2 Fermi费米架构Fermi的特征是:SM片内可配置存储器并发内核执行3.1.3 Kepler架构动态并行Hyper-Q技术3.1.4 配置文件驱动优化CUDA提供了两个主要的性能分析工具事件和指标有3种常见的限制内核性能的因素:3.1 CUDA执行模型概述执行模型会提供一个操作视图,说明如何在特定的计算架构上执行指令。CUDA执行模型解释了GPU原创 2021-03-18 16:37:23 · 577 阅读 · 0 评论 -
CUDA学习之第二章CUDA编程模型--下集
文章目录2.3组织并行线程2.3.1使用块和线程建立矩阵索引2.3.1使用二维网格和二维块对矩阵求和2.3.3使用一维网格和一维块对矩阵求和2.3.4使用二维网格和一维块对矩阵求和小结2.4设备管理2.4.1使用运行时API查询GPU信息2.4.2确定最优GPU2.4.3使用nvidia-smi查询GPU信息2.4.4在运行时设置设备1. CUDA学习之基于CUDA的异构并行计算2. CUDA学习之CUDA编程模型–上集2.3组织并行线程如果使用了合适的网格和块大小来正确地组织线程,那么可以对内核原创 2021-03-16 17:05:16 · 379 阅读 · 0 评论 -
CUDA学习之第二章CUDA编程模型--上集
文章目录CUDA编程模型CUDA编程模型概述CUDA编程结构*内存管理针对内存操作的CUDA C函数GPU内存结构*两个数组相加:如何在主机和设备之间进行数据传输**cpu版**GPU版线程管理线程层次结构线程坐标网格和块的维度代码示例启动一个CUDA核函数异步编写核函数CUDA核函数的限制CUDA编程模型CUDA编程模型概述编程模型提供了一种连接应用和其实现的计算机架构抽象。下图展示了程序和编程模型实现之间的重要层。通信抽象是程序与编程模型实现之间的分界线,通过专业的硬件原语和操作系统的编译器或原创 2021-03-15 22:53:55 · 509 阅读 · 0 评论 -
CUDA学习之第一章基于CUDA的异构并行计算
1.基于CUDA的异构并行计算并行计算并行计算通常涉及两个不同的计算技术领域。计算机架构(硬件方面)并行程序设计(软件方面)计算机架构关注的是在结构级别上支持并行性,而并行编程设计关注的是充分使用计算机架构的计算能力来并发地解决问题。为了在软件中实现并行执行,硬件必须提供一个支持并行执行多进程或多线程的平台。大多数现代处理器都应用了哈佛体系结构(Harvard architecture),如图1-1所示,它主要由3个部分组成:内存(指令内存和数据内存)中央处理单元(控制单元和算术原创 2021-03-15 11:21:49 · 980 阅读 · 0 评论