CUDA学习笔记7——CUDA内存组织
CUDA内存组织
CUDA设备内存的分类与特征
| 内存类型 | 物理位置 | 访问权限 | 可见范围 | 生命周期 | |
|---|---|---|---|---|---|
| 1 | 全局内存 | 芯片外 | 可读写 | 所有线程和主机端 | 由主机分配与释放 |
| 2 | 常量内存 | 芯片外 | 只读 | 所有线程和主机端 | 由主机分配与释放 |
| 3 | 纹理和表面内存 | 芯片外 | 一般只读 | 所有线程和主机端 | 由主机分配与释放 |
| 4 | 寄存器内存 | 芯片内 | 可读写 | 单个线程 | 所在线程 |
| 5 | 局部内存 | 芯片外 | 可读性 | 单个线程 | 所在线程 |
| 6 | 共享内存 | 芯片内 | 可读性 | 单个线程块 | 所在线程块 |
-
全局内存:核函数中所有线程都能访问其中的数据。
用cudaMalloc()为全局内存变量分配设备内存;
用cudaMemcpy()将主机数据复制到全局内存; -
常量内存:一共64KB,只读,可见范围与生命周期与全局内存一样,访问速度比全局内存快;在核函数未满用 _constant_ 定义变量;并使用cudaMemcpyToSymbol()将数据从主机端复制到设备的常量内存。
-
纹理内存与表面内存:类似于常量内存(可见范围与生命周期相同);
-
寄存器:在核函数中定义的不加任何限定符的变量一般来说放在寄存器中,核函数定义不加任何限定符的数组可能放于寄存器,也可能放于局部内存中;
-
局部内存:寄存器放不下的变量,索引值不能在编译时确定的数组;
-
共享内存:与寄存器类似,存在于芯片上,仅次于寄存器的读写速度;
CUDA中的内存组织示意图

GPU设备规格查询
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"int main()
{int device_id = 0;cudaDeviceProp prop;cudaGetDeviceProperties(&prop, device_id);printf("Device id: %d\n", device_id);printf("Device name: %s\n", prop.name);printf("Compute capability: %d.%d\n", prop.major, prop.minor);printf("Amount of global memory: %g GB\n", prop.totalGlobalMem / 1024.0);printf("Amount of constant memory: %g KB\n", prop.totalConstMem / 1024.0);printf("Maximum grid size: %d %d %d\n",prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]);printf("Maximum block size: %d %d %d\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]);printf("Number of SMs: %d\n", prop.multiProcessorCount);printf("----------------------------- \n");printf("Maximum amount of shared memory per block: %g KB\n", prop.sharedMemPerBlock / 1024.0);printf("Maximum amount of shared memory per SM: %g KB\n",prop.sharedMemPerMultiprocessor / 1024.0);printf("Maximum number of registers per block: %d K\n", prop.regsPerBlock / 1024.0);printf("Maximum number of registers per SM: %d K\n", prop.regsPerMultiprocessor / 1024.0);printf("Maximum number of threads per block: %d \n", prop.maxThreadsPerBlock);printf("Maximum number of threads per SM: %d \n", prop.maxThreadsPerMultiProcessor);return 0;
}

全局内存的合并与非合并访问
合并访问:一个线程束对全局内存的一次访问(读/写)导致最少数量的数据传输;否则为非合并访问。
利用共享内存和统一内存优化矩阵乘

#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<math.h>
#include <malloc.h>
#include <opencv2/opencv.hpp>
#include <stdlib.h>//利用share memory 和统一内存优化矩阵乘#define M 1000
#define N 500
#define K 1000__managed__ int a[M*N];
__managed__ int b[N*K];
__managed__ int c_gpu[M*K];
__managed__ int c_cpu[M*N];#define BLOCK_SIZE 16__global__ void gpu_matrix(int* a, int* b, int* c, int m, int n, int k)
{__shared__ int sub_a[BLOCK_SIZE][BLOCK_SIZE];__shared__ int sub_b[BLOCK_SIZE][BLOCK_SIZE];int x = blockIdx.x*blockDim.x + threadIdx.x;int y = blockIdx.y*blockDim.y + threadIdx.y;int tmp = 0;int idx;for (int step = 0; step < N/BLOCK_SIZE; step++){int step_x = step*BLOCK_SIZE + threadIdx.x;int step_y = y;idx = step_y*n + step_x;if (step_x>n || step_y>m){sub_a[threadIdx.y][threadIdx.x] = 0;}else{sub_a[threadIdx.x][threadIdx.x] = a[idx];}step_x = x;step_y = step*BLOCK_SIZE + threadIdx.y;idx = step * k + step_x;if (step_x >= k || step_y>=n){sub_b[threadIdx.y][threadIdx.x] = 0;}else{sub_b[threadIdx.y][threadIdx.x] = b[idx];}__syncthreads();for (int i = 0; i < BLOCK_SIZE; i++){tmp += sub_a[threadIdx.y][i] * sub_b[i][threadIdx.x];}__syncthreads();}if (x<k && y<m){c[y*k + x] = tmp;}}void cpu_matrix(int* a, int* b, int* c, int m, int n, int k)
{for (int y = 0; y < m; y++){for (int x = 0; x < k; x++){int tmp = 0;for (int step = 0; step < n; step++){tmp += a[y*n + step] * b[step*n + x];}c[y*k + x] = tmp;}}}int main()
{for (int y = 0; y < M; y++){for (int x = 0; x < N; x++){a[y * N + x] = rand() % 1024;}}for (int y = 0; y < N; y++){for (int x = 0; x < K; x++){b[y*K + x] = rand() % 1024;}}unsigned int grid_x = (K + BLOCK_SIZE - 1) / BLOCK_SIZE;unsigned int grid_y = (M + BLOCK_SIZE - 1) / BLOCK_SIZE;dim3 dimGrid(grid_x, grid_y);dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);gpu_matrix<<<dimGrid, dimBlock>>>(a, b, c_gpu, M, N, K);cpu_matrix(a, b, c_cpu, M, N, K);bool errors = false;for (int y = 0; y < M; y++){for (int x = 0; x < K; x++){if (fabs(c_cpu[y*K + x] - c_gpu[y*K + x]) > (1.0e-10)){errors = true;}}}printf("Result: %s\n", errors ? "Error" : "Pass");return 0;
}相关文章:
CUDA学习笔记7——CUDA内存组织
CUDA内存组织 CUDA设备内存的分类与特征 内存类型物理位置访问权限可见范围生命周期1全局内存芯片外可读写所有线程和主机端由主机分配与释放2常量内存芯片外只读所有线程和主机端由主机分配与释放3纹理和表面内存芯片外一般只读所有线程和主机端由主机分配与释放4寄存器内存…...
C#把自启动程序添加到注册表中
1.Regedit自启动注册表路径 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 2.获取运行程序路径 SetAutoStart(AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.BaseDirectory); 3.添加到注册表中,如果注册表已经存…...
Java面试题(每天10题)-------连载(26)
目录 多线程篇 1、什么是FutureTask? 2、什么是同步容器和并发容器的实现? 3、什么是多线程的上下文切换? 4、ThreadLocal的设计理念与作用? 5、ThreadPool(线程池)用法与优势? 6、Concur…...
通用型 SPI-Flash 相关知识汇总(w25q16\q64,gd25q128\q256)
目录 管脚定义: 常用指令: GD25q16: gd25Q28 编辑 gw25q16 编辑 芯片丝印说明: GD系列: winbond系列: Read Identification(9FH): 常见ID: GD: 编辑…...
鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用
一、了解超级终端模拟器支持的设备情况 该特性在DevEco Studio V2.1 Release及更高版本中支持。 目前超级终端模拟器支持“PhonePhone”、“PhoneTablet”和“PhoneTV”的设备组网方式,开发者可以使用该超级终端模拟器来调测具备跨设备特性的应用/服务,如…...
抖音AAN服务商有几家?
大家都知道抖音服务商多如牛毛,有本地生活服务商,MCN机构服务商,企业认证服务商,ISV服务商等等。但是aan服务商就屈指可数。 aan技术服务商 从关系层面讲,aan服务商的关系友好到啥程度呢,就好比微信指定了…...
10-26 maven配置
打开idea 打开setting 基于Idea创建idea项目 加载jar包:(一般需要自己去手动加入,本地仓库是没有的)...
贰[2],OpenCV函数解析
1,imread:图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename):文件地址 //参数2(flags):读取标志 注:ImreadModes,参数2(flags)枚举定义 enum ImreadModes { IMREAD…...
探秘Python闭包与作用域
文章目录 闭包的定义与作用LEGB规则nonlocal与global关键字在Python的世界里,理解闭包(Closure)和作用域(Scope)是提升编程技巧和深度的一大步。这篇文章将带你深入了解闭包的神秘面纱,掌握LEGB规则,并使用nonlocal与global关键字来巧妙控制变量作用域。 闭包的定义与作…...
GPT-4V:AI在教育领域的应用
OpenAI于9月25日发布了最新的GPT-4V模型,为ChatGPT引入了语音和图像功能,为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验,用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…...
自动化之Java面试
1.重写与重载的区别 重载规则: 方法名相同,参数个数或类型不同,与返回值类型无关,节约词汇,例如driver.switchTo().frame(index/nameOrId/frameElement) java的重载(overload) 最重要的应用场景就是构造器…...
Redis中的Zset类型
目录 Zset的相关命令 zadd zrange zcard zcount zrevrange zrangebyscore zpopmax bzpopmax zpopmin和bzpopmin zrank zrevrank zscore zrem zremrangebyrank zremrangebyscore 操作集合间的命令 zinterstore和zunionstore 内部编码 Zset的应用场景 Zset表…...
Python行对齐工具difflib
1 用途 1.1 功能 对比两个字符串数组之间的差异,以第一个参数为基准,与第二个参数比较。 1.2 使用场景 一个原文件,一个改过的文件,对比差异;一个纯文本,一个带格式的,对比差异;…...
Flutter利用GridView创建网格布局实现优美布局
文章目录 简介使用详解导入依赖项创建一个基本的 GridView一些参数说明使用GridView.count来构造 其他控制总结 简介 GridView 是 Flutter 中用于创建网格布局的强大小部件。它允许你在行和列中排列子小部件,非常适合显示大量项目,例如图像、文本、卡片…...
IDEA 基本配置
IDEA 基本配置 1、基本样式2、环境参数3、基本插件4、参考 1、基本样式 设置全局字体大小 配置font 字体大小:15 配置类注释 /** ** Author: ${USER}* Date: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}* Version: 1.0.0 */配置注释keymap 添加 注释 ccm&…...
计算机组成原理平时作业一
计算机组成原理平时作业一 1.单选题 1.1计算机中使用总线结构便于增减外设,同时(c )。 a.减少了信息传输量 b.提高了信息传输量 c.减少了信息传输量的条数 d.三者均正确 答案解析: 概念规定 1.2在定点补码运算器中,…...
iOS Crash 治理:淘宝VisionKitCore 问题修复
本文通过逆向系统,阅读汇编指令,逐步找到源码,定位到了 iOS 16.0.<iOS 16.2 WKWebView 的系统bug 。同时苹果已经在新版本修复了 Bug,对于巨大的存量用户,仍旧会造成日均 Crash pv 1200 uv 1000, 最终通…...
NSSM部署window服务
nssm 下载 安装服务:nssm install <servicename> 启动服务:nssm start <servicename> 停止服务:nssm stop <servicename> 重启服务: nssm restart <servicename> 删除创建的servername服务: nssm remove <service…...
Go语言数据类型
文章目录 Go语言数据类型一、布尔类型二、数字类型三、字符串类型四、派生类型 Go语言数据类型 在 Go 编程语言中,数据类型用于声明函数和变量。 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存…...
Python爬取汽车之家二手车数据并作可视化
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 课程亮点: 1、系统分析目标网页 2、html标签数据解析方法 3、海量数据一键保存 获取二手车数据 环境介绍: python 3.8 pycharm 2022.3专业版 requests >>>…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)
做RAG自己打算使用esmilvus自己开发一个,安装时好像网上没有比较新的安装方法,然后找了个旧的方法对应试试: 🚀 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana,适配中文搜索…...
