CUDA各种内存和使用方法

文章目录

      • 1、全局内存
      • 2、局部内存
      • 3、共享内存
        • 3.1 静态共享内存
        • 3.2 动态共享内存
      • 4、纹理内存
      • 5、常量内存
      • 6、寄存器内存
      • 7、用CUDA运行时API函数查询设备
      • CUDA 错误检测

在这里插入图片描述在这里插入图片描述

1、全局内存

特点:容量最大,访问延时最大,所有线程都可以访问。 线性内存。
cudaMalloc() 动态分配内存
cudaFree() 释放内存
_device_ int buff[N] 使用固定长度的静态全局内存
动态内存使用cudaMemcpy 在host 和 device之间传输
静态内存 host 和 device 之间传输数据:
cudaMemcpyToSymbol() host 传到device
cudaMemcpyFromSymbol() device传到host

在这里插入图片描述

#include <cuda.h>
#include <cuda_runtime.h>
__device__ int d_x = 1;
__device__ int d_y[2];
__global__ void cudaOut(void) {d_y[0]+= d_x;d_y[1]+= d_x;
}
int main(void) {int h_y[2] = { 10,20 };CHECK(cudaMemcpyToSymbol(d_y, h_y, sizeof(int) * 2));cudaOut<<<1,1>>>();CHECK(cudaDeviceSynchronize());CHECK(cudaMemcpyFromSymbol(h_y, d_y, sizeof(int) * 2));return 0;
}

2、局部内存

特点:存储线程私有的局部变量,在寄存器内存不足时使用。

3、共享内存

特点:片上内存,访问速度快,线程块内共享
使用:存储线程块中的共享数据,加速线程间的数据处理
每个SM的共享内存数量是一定的,也就是说,如果在单个线程块中分配过度的共享内存,将会限制活跃线程束的数量;合适分配单个线程块的共享内存,使得SM的使用率最大化,起到加速的作用。

例如:blockSize = 128,一个SM有2048个线程,那么一个SM能同时处理16个block。如果SM有96K的共享内存,每个block则分配96 / 16 = 6K,太大其他block无法获得使用。

__syncthreads 通常用于协调同一块中线程间的通信。

__global__ void kernel_function(parameters) {// 假设算法的特殊设计导致对变量 data 的访问不得不是非合并的// 1. 定义共享内存__shared__ float s_data [data_size];// 2. 将 data 复制到共享内存s_data[copy_index] = data[copy_index];// 3. 等待线程块中所有线程完成复制操作__syncthreads();// 4. 进行操作(包含非合并内存访问)operations(data);
}
3.1 静态共享内存
// 静态共享内存
__global__ void staticReverse(int* d, int n){__shared__ int s[64];int t = threadIdx.x;s[t] = d[t];__syncthreads();
}
int main(void){
staticReverse << <1, n >> > (d_d, n);
}
3.2 动态共享内存

调用时指定共享内存大小
如果一个共享内存的大小在编译时是未知的, 则需要添加 extern修饰,在内核调用时动态分配。

__global__ void dynamicReverse(int* d, int n){extern __shared__ int s[];int t = threadIdx.x;s[t] = d[t];
}
int main(void){
dynamicReverse << <1, n, n * sizeof(int) >> > (d_d, n);
}

4、纹理内存

特点:优化二维数据的访问,具有缓存加速
使用:适用图像处理和大规模数据访问

5、常量内存

特点:存储只读数据,访问速度快,广播式访问。数量有限,最多64KB
使用:频繁访问的常量数据,所有线程块都能访问,全局可见。
使用_constant_修饰
只能通过cudaMemcpyToSymbol() 或**cudaMemcpyToSymbolAsync()**进行数据传输

const int N = 4;
// 定义结构体
struct ConstStruct {float array[N];float singleValue;
};
// 常量内存变量声明
__constant__ float d_constArray[N];    // 数组
__constant__ float d_singleValue;      // 单个变量
__constant__ ConstStruct d_constStruct; // 结构体
// 定义核函数
__global__ void kernelFunction(float* d_result, float* d_result_s) {int idx = threadIdx.x;if (idx < N) {// 从常量内存中读取常量数组和单个值,将结果存入 d_resultd_result[idx] = d_constArray[idx] + d_singleValue;// 从常量内存中的结构体读取数据,将数组中的值和单个值相加,并存入 d_result_sd_result_s[idx] = d_constStruct.array[idx] + d_constStruct.singleValue;}
}
int main() {// 将数据从主机复制到常量内存CHECK(cudaMemcpyToSymbol(d_constArray, h_array, N * sizeof(float)));CHECK(cudaMemcpyToSymbol(d_singleValue, &h_singleValue, sizeof(float)));CHECK(cudaMemcpyToSymbol(d_constStruct, &h_constStruct, sizeof(ConstStruct)));kernelFunction << <1, N >> > (d_result, d_result_s);
}

6、寄存器内存

特点:片上内存,访问速度最快
使用:局部变量

7、用CUDA运行时API函数查询设备

该段介绍用 CUDA 运行时 API 函数查询所用 GPU 的规格 ,可以通过以下代码查看显卡的信息:

#include <iostream>
#include <cuda_runtime.h>
#include "error_check.cuh"
int main(int argc, char* argv[]) {int device_id = 0;//如果你不止一个显卡,可以切换ID,输出不同显卡的信息if (argc > 1) device_id = atoi(argv[1]);CHECK(cudaSetDevice(device_id));cudaDeviceProp prop;CHECK(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 * 1024 * 1024));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("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);//个SM可以分配的最大共享内存总量printf("Maximum number of registers per block: %d K\n", prop.regsPerBlock / 1024);//每个线程块可以使用的最大寄存器数量printf("Maximum number of registers per SM: %d K\n", prop.regsPerMultiprocessor / 1024);//每个SM可以分配的最大寄存器总量printf("Maximum number of threads per block: %d\n", prop.maxThreadsPerBlock);printf("Maximum number of threads per SM: %d\n", prop.maxThreadsPerMultiProcessor);//每个SM可以同时运行的最大线程数量return 0;
}

CUDA 错误检测

#define CHECK(call)                 \    
do                                  \
{                                   \const cudaError_t error_code = call;                \if (error_code != cudaSuccess)                  \{                                   \printf("CUDA ERROR:\n");                    \printf("    FILE:   %s\n", __FILE__);           \printf("    LINE:   %d\n", __LINE__);           \printf("    ERROR CODE: %d\n", error_code);         \printf("    ERROR TEXT: %s\n", cudaGetErrorString(error_code)); \exit(1);                            \}                                   \
} while(0)

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

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

相关文章

Chapter 03 复合数据类型-1

1.列表 Python内置的一种有序、可变的序列数据类型&#xff1b; 列表的定义&#xff1a; [ ]括起来的逗号分隔的多个元素组成的序列 列表对象的创建&#xff1a; &#xff08;1&#xff09;直接赋值 >>> list1 []#创建一个空列表赋值给list1 >>> list…

【后端】LNMP环境搭建

长期更新各种好文&#xff0c;建议关注收藏&#xff01; 本文近期更新完毕。 LNMPlinuxnginxmysqlphp 需要的资源 linux服务器 web服务软件nginx 对应的语言编译器代码文件 数据库mysql安装 tar.gz包或者命令行安装 进入root&#xff1a; sodu 或su mkdir path/{server,soft}…

基于PyQt5的UI界面开发——多界面切换

介绍 最初&#xff0c;因为课设的缘故&#xff0c;我只是想做一个通过按键进行切面切换而已&#xff0c;但是我看网上资料里面仅是语焉不详&#xff0c;让我困惑的很&#xff0c;但后面我通过摸索才发现这件事实在是太简单了&#xff0c;因此我想要记录下来。 本博客将介绍如…

操作002:HelloWorld

文章目录 操作002&#xff1a;HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端&#xff08;生产者&#xff09;②消息接收端&#xff08;消费者&#xff09;③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…

机器视觉检测相机基础知识 | 颜色 | 光源 | 镜头 | 分辨率 / 精度 / 公差

注&#xff1a;本文为 “keyence 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识&#xff08;一&#xff09;颜色篇 视觉检测硬件构成的基本部分包括&#xff1a;处理器、相机、镜头、光源。 其中&#xff0c;和光源相关的最重要的两个参数就是光源颜色和…

【每日学点鸿蒙知识】压力测试、Web组件拦截器、nfc开关状态、定位能力、rn支持的三方库

1、HarmonyOS的wukong 支持运行python脚本进行压力或者常规测试吗&#xff1f; Python脚本调用hdc命令&#xff0c;执行hdc shell wukong XXXwukong只支持稳定性压测&#xff0c;普通测试建议使用arkxtest测试框架 2、Web组件页面内跳转时自定义WebHeader问题&#xff1f; 如…

GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)

记住&#xff0c;年底陪你跨年的不会仅是方便面跟你的闺蜜&#xff0c;还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根实例对象的元素是&#xff08;&…

Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用

Flutter开发HarmonyOS的好处&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…

Effective C++ 条款 17:以独立语句将 `newed` 对象置入智能指针

文章目录 条款 17&#xff1a;以独立语句将 newed 对象置入智能指针核心思想示例代码错误用法分析推荐设计总结 条款 17&#xff1a;以独立语句将 newed 对象置入智能指针 核心思想 问题背景 如果在将 newed 对象传递给智能指针时&#xff0c;包含了复杂的表达式&#xff0c;一…

【体验官招募】SoFlu - JavaAI 开发助手:开启智能开发新时代

你是否有过这样的经历&#xff1f;在深夜的办公室里&#xff0c;面对紧急的 Java 项目&#xff0c;看着厚厚的需求文档&#xff0c;你是否感到无从下手&#xff1f; 当你尝试理解客户那些复杂又模糊的需求时&#xff0c;是否会因为要和产品经理反复沟通确认每一个细节而感到厌…

【Compose multiplatform教程07】多平台常用组件和重要组件目录

一、基础交互与显示组件 Text 查看示例 功能说明&#xff1a;用于在界面上显示文本内容&#xff0c;支持设置字体、大小、颜色、样式&#xff08;如加粗、斜体、下划线&#xff09;等属性&#xff0c;满足不同的文本展示需求&#xff0c;可传达各种信息给用户。示例场景&#…

自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统

在完成了HarmonyOS Camera API的开发之后&#xff0c;我开始关注更复杂的系统级功能。在浏览HarmonyOS Next文档时&#xff0c;我发现了一个非常有趣的领域&#xff1a;数字版权管理&#xff08;DRM&#xff09;。最新的DRM API 13提供了强大的工具&#xff0c;用于保护数字内容…

【HENU】河南大学计院2024 操作系统 简答题复习

和光同尘_我的个人主页 一直游到海水变蓝。 单项选择 15x2 30 判断 10x1 10 简答 3x10 30 综合 3x10 30 简答题 简述操作系统的四个基本特征。 并发性 共享性 虚拟性 异步性 并发性是最重要特性&#xff0c;其它三种特性以此为前提。 并发 并发(Concurrence)&#…

基于Android的校园导航系统

基于Android的校园导航系统是一种专为校园环境设计的移动应用程序&#xff0c;旨在帮助学生、教职工及访客快速、准确地找到校园内的目的地。以下是对基于Android的校园导航系统的详细介绍&#xff1a; 一、系统概述 基于Android的校园导航系统通常包括客户端&#xff08;移动…

GEE错误——PCA系数变换的时候出现的错误

目录 错误提示1 错误提示2 原始的教程链接&#xff1a; 错误代码 修正后的代码 结果 错误提示1 这个是因为原始GEE教程中给的让我们填入需要进行计算的波段名称&#xff0c;而且是以list的形式传入。 错误提示2 这里我们虽然传入了正确的波段名称&#xff0c;但是发现要…

C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容

我们有一个中文录音文件.mp3格式或者是.wav格式&#xff0c;如果我们想要提取录音文件中的文字内容&#xff0c;我们可以采用以下方法&#xff0c;不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…

【py脚本+logstash+es实现自动化检测工具】

概述 有时候&#xff0c;我们会遇到需要查看服务器的网络连接或者内存或者其他指标是否有超时&#xff0c;但是每次需要登录到服务器查看会很不方便,所以我们可以设置一个自动脚本化工具自动帮助我们查看&#xff0c;下面我做了一个demo在windows上面。 一、py脚本 import s…

计算机操作系统与安全复习笔记

1 绪论 操作系统目标: 方便性; 有效性; 可扩充性; 开放性. 作用: 用户与计算机硬件系统之间的接口; 计算机资源的管理者; 实现了对计算机资源的抽象; 计算机工作流程的组织者. 多道程序设计: 内存中同时存放若干个作业, 使其共享系统资源且同时运行; 单处理机环境下宏观上并行…

qt5.12.11+msvc编译器编译qoci驱动

1.之前编译过minGW编译器编译qoci驱动,很顺利就完成了,文章地址:minGW编译qoci驱动详解,今天按照之前的步骤使用msvc编译器进行编译,直接就报错了: 查了些资料,发现两个编译器在编译时,pro文件中引用的库不一样,下面是msvc编译器引用的库,其中编译引用的库我这里安装…

Java爬虫实战:深度解析VIP商品详情获取技术

在数字化时代&#xff0c;数据的价值不言而喻。对于电商平台而言&#xff0c;掌握VIP商品的详细信息是提升服务质量、优化用户体验的关键。然而&#xff0c;这些信息往往被复杂的网页结构和反爬虫策略所保护。本文将带你深入了解如何使用Java编写爬虫&#xff0c;以安全、高效地…