flâneur

wangzyon/NVIDIA_SGEMM_PRACTICE: Step-by-step optimization of CUDA SGEMM

github.com · 1,299 words · saved by 1 readers

Couldn't load subscription status.  Retry There was an error while loading. Please reload this page. There was an error while loading. Please reload this page. Step-by-step optimization of CUDA SGEMM There was an error while loading. Please reload this page. 面向NVIDIA GPU,使用CUDA编程逐步优化矩阵乘法运算性能: NVIDIA GeForce RTX 3090,矩阵尺寸5120 在CMakeLists.txt中修改set(CUDA_NVCC_FLAGS -arch=compute_70;-code=compute_70) 在sgemm.cu:16中修改size_len,建议初次运行设置为16,过大尺寸可能导致电源超负荷主机重启; python plot.py 0 1表示绘制CUBLAS和kernel_1计算效率对比图; Naive基础版矩阵乘法实现 将每个逻辑线程与矩阵C的每一个元素相对应,每个线程负责C中一个元素的计算; 未经过优化的矩阵乘法性能不足CUBLAS的1/10,具体分析如下; 全局内存访问延迟高(几百cycle),同时相同位置元素被重复读取(C中同一行元素计算共享A中同一行元素,C中同一列元素计算共享B中同一列元素),另一方面,较低的计算访存比无法有效隐藏访存延迟,因此,访存延迟和计算访存比是导致kernel 1效率低下的原因。 利用共享内存缓存减少全局内存访存量和访存延迟 访存延迟来自于全局内存的高延迟和全局内存的重复访问。共享内存是片上内存,具有较低的访存延迟(几十cycle),使用共享内存进行缓存可降低访存延迟; BM和BN表示block tile的高和宽,BK表示待缓存的全局内存的步长,即一个block的计算需要缓存K/BK次; 共享内存缓存全局内存A tile和B tile,完成C block中所有元素的FMA计算,不断滑动缓存区域,更新block; kernel 1受限于全局内存的访存延迟和重复访问,优化前全局访存量为

概述 面向NVIDIA GPU,使用CUDA编程逐步优化矩阵乘法运算性能: 核函数 描述 GFLOPS 自定义核函数/CUBLAS(%) CUBLAS 官方库函数 14448.69 基准 kernel_1 朴素实现 2262.168 15.65657 kernel_2 共享内存缓存 4216.536 29.18283 kernel_3 一维Thread Tile并行优化 7809.629 54.05078 kernel_4 二维Thread Tile并行优化 12251.3 84.79179 kernel_5 寄存器缓存 12177.95 84.28412 kernel_6 FLOAT4向量访存 13161.49 91.09125 kernel_7 双缓存预取 13634.98 94.36832 NVIDIA GeForce RTX 3090,矩阵尺寸5120 配置 编译采用 gcc 7.5.0 under Ubuntu 18.04.5 LTS NVIDIA CUDA version: CUDA 10.2; 目录 NVIDIA_SGEMM_PRACTICE # 根目录 ├── images # 图片结果 │ ├── describe_kernel_1.png │ ├── describe_kernel_x.png │ └──…

saved by

related reading