【cuda学习日记】5.2 共享内存数据分布

原文需要用nvprof去检查共享内存的事务,受限于nvprof不能使用。

5.2.1 方形共享内存
声明共享内存:
shared int tile[N][N];
因为是方形的内存块,用一个二维线程块访问,2种方法去访问:
tile[threadIdx.y][threadIdx.x]
tile[threadIdx.x][threadIdx.y]

核函数有两个简单操作:
·将全局线程索引按行主序写入到一个二维共享内存数组中
·从共享内存中按行主序读取这些值并将它们存储到全局内存中

#include <cuda_runtime.h>
#include <stdio.h>
#include "../common/common.h"
#include <iostream>#define BDIMX 32
#define BDIMY 32__global__ void warmup(int *out){__shared__ int tile[BDIMY][BDIMX];unsigned int idx = blockIdx.y * blockDim.x + threadIdx.x;// smem storetile[threadIdx.y][threadIdx.x] = idx;__syncthreads();// smem loadout[idx] = tile[threadIdx.y][threadIdx.x];
}__global__ void setRowReadRow(int *out){__shared__ int tile[BDIMY][BDIMX];unsigned int idx = blockIdx.y * blockDim.x + threadIdx.x;// smem storetile[threadIdx.y][threadIdx.x] = idx;__syncthreads();// smem loadout[idx] = tile[threadIdx.y][threadIdx.x];
}__global__ void setColReadCol(int *out){__shared__ int tile[BDIMY][BDIMX];unsigned int idx = blockIdx.y * blockDim.x + threadIdx.x;// smem storetile[threadIdx.x][threadIdx.y] = idx;__syncthreads();// smem loadout[idx] = tile[threadIdx.x][threadIdx.y];
}int main(int argc, char** argv){int dev = 0;cudaSetDevice(dev);cudaDeviceProp deviceprop;CHECK(cudaGetDeviceProperties(&deviceprop,dev));printf("device %d: %s \n", dev, deviceprop.name);std::cout << "Compute Capability: " << deviceprop.major << "." << deviceprop.minor << std::endl;dim3 block(BDIMX, BDIMY);dim3 grid (1,1); //only 1 blockint nElem = BDIMX * BDIMX;int nBytes = nElem * sizeof(int);int *d_A;cudaMalloc((int**) &d_A, nBytes);Timer timer;timer.start();warmup<<<grid,block>>>(d_A);cudaDeviceSynchronize();timer.stop();float elapsedTime = timer.elapsedms();printf("warmup <<<grid (%4d, %4d), block (%4d, %4d)>>> elapsed %f ms \n", grid.x,grid.y, block.x, block.y, elapsedTime);timer.start();setRowReadRow<<<grid,block>>>(d_A);cudaDeviceSynchronize();timer.stop();elapsedTime = timer.elapsedms();printf("setRowReadRow <<<grid (%4d, %4d), block (%4d, %4d)>>> elapsed %f ms \n", grid.x,grid.y, block.x, block.y, elapsedTime);timer.start();setColReadCol<<<grid,block>>>(d_A);cudaDeviceSynchronize();timer.stop();elapsedTime = timer.elapsedms();printf("setColReadCol <<<grid (%4d, %4d), block (%4d, %4d)>>> elapsed %f ms \n", grid.x,grid.y, block.x, block.y, elapsedTime);cudaFree(d_A);cudaDeviceReset();return 0;}

nvcc checkSmemSquare.cu -Xptxas -v -o checkSmemSquare.exe

checkSmemSquare.cu
ptxas info    : 0 bytes gmem
ptxas info    : Compiling entry function '_Z13setColReadColPi' for 'sm_52'
ptxas info    : Function properties for _Z13setColReadColPi0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 6 registers, used 1 barriers, 4096 bytes smem, 328 bytes cmem[0]
ptxas info    : Compiling entry function '_Z13setRowReadRowPi' for 'sm_52'
ptxas info    : Function properties for _Z13setRowReadRowPi0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 6 registers, used 1 barriers, 4096 bytes smem, 328 bytes cmem[0]
ptxas info    : Compiling entry function '_Z6warmupPi' for 'sm_52'
ptxas info    : Function properties for _Z6warmupPi0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 6 registers, used 1 barriers, 4096 bytes smem, 328 bytes cmem[0]
tmpxft_00004be0_00000000-10_checkSmemSquare.cudafe1.cppCreating library checkSmemSquare.lib and object checkSmemSquare.exp

尝试通过NCU查看shared memory transactions
ncu --metrics smsp__sass_inst_executed_op_shared,smsp__sass_inst_executed_op_shared_ld,smsp__sass_inst_executed_op_shared_st checkSmemSquare.exe
没看出来啥区别

setRowReadRow(int *) (1, 1, 1)x(32, 32, 1), Context 1, Stream 7, Device 0, CC 8.9Section: Command line profiler metrics----------------------------------------- ----------- ------------Metric Name                               Metric Unit Metric Value----------------------------------------- ----------- ------------smsp__sass_inst_executed_op_shared.avg           inst         0.12smsp__sass_inst_executed_op_shared.max           inst           16smsp__sass_inst_executed_op_shared.min           inst            0smsp__sass_inst_executed_op_shared.sum           inst           64smsp__sass_inst_executed_op_shared_ld.avg        inst         0.06smsp__sass_inst_executed_op_shared_ld.max        inst            8smsp__sass_inst_executed_op_shared_ld.min        inst            0smsp__sass_inst_executed_op_shared_ld.sum        inst           32smsp__sass_inst_executed_op_shared_st.avg        inst         0.06smsp__sass_inst_executed_op_shared_st.max        inst            8smsp__sass_inst_executed_op_shared_st.min        inst            0smsp__sass_inst_executed_op_shared_st.sum        inst           32----------------------------------------- ----------- ------------setColReadCol(int *) (1, 1, 1)x(32, 32, 1), Context 1, Stream 7, Device 0, CC 8.9Section: Command line profiler metrics----------------------------------------- ----------- ------------Metric Name                               Metric Unit Metric Value----------------------------------------- ----------- ------------smsp__sass_inst_executed_op_shared.avg           inst         0.12smsp__sass_inst_executed_op_shared.max           inst           16smsp__sass_inst_executed_op_shared.min           inst            0smsp__sass_inst_executed_op_shared.sum           inst           64smsp__sass_inst_executed_op_shared_ld.avg        inst         0.06smsp__sass_inst_executed_op_shared_ld.max        inst            8smsp__sass_inst_executed_op_shared_ld.min        inst            0smsp__sass_inst_executed_op_shared_ld.sum        inst           32smsp__sass_inst_executed_op_shared_st.avg        inst         0.06smsp__sass_inst_executed_op_shared_st.max        inst            8smsp__sass_inst_executed_op_shared_st.min        inst            0smsp__sass_inst_executed_op_shared_st.sum        inst           32----------------------------------------- ----------- ------------

5.2.2 按行主序写和按列主序读

__global__ void setRowReadCol(int *out){__shared__ int tile[BDIMY][BDIMX];unsigned int idx = blockIdx.y * blockDim.x + blockIdx.x;// smem storetile[threadIdx.y][threadIdx.x] = idx;__syncthreads();// smem loadout[idx] = tile[threadIdx.x][threadIdx.y];
}

5.2.3 动态共享内存
核函数不知道需要声明多少大小的SMEM时,可以用动态声明

__global__ void setRowReadColDyn(int *out){//dynamic shared memextern __shared__ int tile[];unsigned int row_idx = blockIdx.y * blockDim.x + threadIdx.x;unsigned int col_idx = blockIdx.x * blockDim.y + threadIdx.y;// smem storetile[row_idx] = row_idx;__syncthreads();// smem loadout[row_idx] = tile[col_idx];
}

在调用核函数的时候需要在<<>>>的第三个参数中传递memory大小

setRowReadColDyn<<<grid,block, BDIMX * BDIMY * sizeof(int)>>>(d_A);

5.2.4 填充静态声明的共享内存
填充数组是避免存储体冲突的一种方法。填充静态声明的共享内存很简单。

#define IPAD 1
__global__ void setRowReadColPad(int *out){__shared__ int tile[BDIMY][BDIMX + IPAD];unsigned int idx = blockIdx.y * blockDim.x + threadIdx.x;// smem storetile[threadIdx.y][threadIdx.x] = idx;__syncthreads();// smem loadout[idx] = tile[threadIdx.x][threadIdx.y];
}

nsys profile --stats=true .\checkSmemSquare.exe

 Time (%)  Total Time (ns)  Instances  Avg (ns)  Med (ns)  Min (ns)  Max (ns)  StdDev (ns)           Name--------  ---------------  ---------  --------  --------  --------  --------  -----------  -----------------------23.4             1728          1    1728.0    1728.0      1728      1728          0.0  setColReadCol(int *)18.6             1376          1    1376.0    1376.0      1376      1376          0.0  setRowReadCol(int *)17.7             1312          1    1312.0    1312.0      1312      1312          0.0  warmup(int *)13.4              992          1     992.0     992.0       992       992          0.0  setRowReadColDyn(int *)13.4              992          1     992.0     992.0       992       992          0.0  setRowReadColPad(int *)13.4              992          1     992.0     992.0       992       992          0.0  setRowReadRow(int *)  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25132.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ros安装rqt_joint_trajectory_controller

有时候&#xff0c;我们可以看到别人的代码里面有这个&#xff0c;但是这个是需要安装的。 <node name"gui_controller" pkg"rqt_joint_trajectory_controller" type"rqt_joint_trajectory_controller" />sudo apt-get install ros-noeti…

ARM Linux LCD上实时预览摄像头画面

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…

是德科技keysight N5173B信号发生器,是一款经济高效的仪器

是德科技keysight N5173B信号发生器安捷伦N5173B信号源 是德N5173B微波模拟信号发生器&#xff0c;拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;N5173B为宽带滤波器、放大器、接收机等器件的参数测试提供了必要的信号&#xff0c;是一款经济高效的仪器。 N5173B特点&…

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…

registry 容器镜像测试

registry 封装容器部署环境测试 封装打包镜像 dockerfile # 阶段 1&#xff1a;构建阶段&#xff08;使用多阶段构建以减少最终镜像大小&#xff09; FROM golang:1.22-alpine AS builder # 安装构建所需工具 RUN #apk add --no-cache git # 设置工作目录 WORKDIR /app # 将…

Python视频网站(Django框架)

有需要请加文章底部Q哦 可远程调试 Python视频网站(Django框架) 一 介绍 此Python视频网站基于Django框架开发&#xff0c;数据库mysql&#xff0c;前端jquery.js。系统角色分为用户和管理员。 技术栈:Python3(Django框架)MySQLjquery.jsPyCharmnavicat 二 功能 用户 1 注册…

多元数据直观表示(R语言)

一、实验目的&#xff1a; 通过上机试验&#xff0c;掌握R语言实施数据预处理及简单统计分析中的一些基本运算技巧与分析方法&#xff0c;进一步加深对R语言简单统计分析与图形展示的理解。 二、实验内容&#xff1a; bank.csv文件中数据来自1969-1971年美国一家银行的474名职…

在MacOS上打造本地部署的大模型知识库(一)

一、在MacOS上安装Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama&#xff0c;就能在webui中加载llama模…

Fiddler在Windows下抓包Https

文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量&#xff08;可选&#xff09;解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下&#xff0c;Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密&#xff1a; 1…

常用的AI文本大语言模型汇总

AI文本【大语言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺问问https://hailuoai.com/ 3、通义千问https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

游戏引擎学习第127天

仓库:https://gitee.com/mrxiao_com/2d_game_3 为本周设定阶段 我们目前的渲染器已经实现了令人惊讶的优化&#xff0c;经过过去两周的优化工作后&#xff0c;渲染器在1920x1080分辨率下稳定地运行在60帧每秒。这个结果是意料之外的&#xff0c;因为我们没有预计会达到这样的…

leetcode 73. 矩阵置零

题目如下 数据范围 如果一个点m(i,j) 0其中i j都大于0那么按照题目要求对应的m[0][j] m[i][0]都要赋值为0. 所以我们可以令第一行和第一列作为标记是否对应的列和行需要置为0. 又因为我们没法判断第一行和第一列所以需要额外两个变量标记第一列和第二列。 这样就可以满足题…

deepseek-r1-centos-本地服务器配置方法

参考&#xff1a; 纯小白 Centos 部署DeepSeek指南_centos部署deepseek-CSDN博客 https://blog.csdn.net/xingxin550/article/details/145574080 手把手教大家如何在Centos7系统中安装Deepseek&#xff0c;一文搞定_centos部署deepseek-CSDN博客 https://blog.csdn.net/soso67…

机器学习:强化学习的epsilon贪心算法

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习方法&#xff0c;旨在通过与环境交互&#xff0c;使智能体&#xff08;Agent&#xff09;学习如何采取最优行动&#xff0c;以最大化某种累积奖励。它与监督学习和无监督学习不同&#xff0c;强调试错…

比创达电子科技-EMC干货之防静电技术

EMC干货之防静电技术 什么是静电放电 两个具有不同静电电位的物体&#xff0c;由于直接接触或静电场感应引起两物体间的静电电荷的转移,静电电场的能量达到一定程度后&#xff0c;击穿其间介质而进行放电的现象就是静电放电,简称为ESD(Electro Static Discharge)。 静电产生的原…

JavaWeb-ServletContext应用域接口

文章目录 ServletContext接口简介获取一个ServletContext对象ServletContext接口中的相关方法获取应用域配置参数关于应用域参数的配置要求getContextPath获取项目路径getRealPath获取真实路径log系列方法添加相关日志增删查应用域属性 ServletContext接口简介 ServletContext…

C语言(15)-------------->一维数组

这篇文章介绍的是数组的定义、创建、初始化、使用&#xff0c;在数组中输入内容并输出数组中的内容&#xff0c;并探讨了数组在内存中的存储。里面有些内容建议大家参考下面的一些文章&#xff0c;有助于加深大家对于C语言的理解&#xff1a; C语言&#xff08;2&#xff09;-…

AI学习第六天-python的基础使用-趣味图形

在 Python 编程学习过程中&#xff0c;turtle库是一个非常有趣且实用的工具&#xff0c;它可以帮助我们轻松绘制各种图形。结合for循环、random模块以及自定义方法等知识点&#xff0c;能够创作出丰富多彩的图案。下面就来分享一下相关的学习笔记。 一、基础知识点回顾 &…

线程安全问题

线程安全问题是指在多线程环境下&#xff0c;当多个线程同时访问共享资源时&#xff0c;可能出现的错误或不可预测的行为。以下是对其的理解&#xff1a; 1. 根本原因 线程安全问题的根本原因是多个线程对共享资源的并发访问。如果多个线程对共享资源进行读写操作&#xff0c…