[7] CUDA之常量内存与纹理内存
CUDA之常量内存与纹理内存
1. 常量内存
- NVIDIA GPU卡从逻辑上对用户提供了 64KB 的常量内存空间,可以用来存储内核执行期间所需要的恒定数据
- 常量内存对一些特定情况下的小数据量的访问具有相比全局内存的额外优势,使用常量内存也一定程序上减少了对全局内存的带宽占用
- 常量内存具有
cache缓冲 - 下边例举一个简单的程序进行
a * x + b的数学运算
#include "stdio.h"
#include<iostream>
#include <cuda.h>
#include <cuda_runtime.h>
//Defining two constants
__constant__ int constant_f;
__constant__ int constant_g;
#define N 5
//Kernel function for using constant memory
__global__ void gpu_constant_memory(float *d_in, float *d_out) {//Thread index for current kernelint tid = threadIdx.x; d_out[tid] = constant_f*d_in[tid] + constant_g;
}
- 常量内存中的变量使用
__constant__关键字修饰 - 使用
cudaMemcpyToSymbol函数吧这些常量复制到内核执行所需要的常量内存中 - 常量内存应合理使用,不然会增加程序执行时间
- 主函数调用如下:
int main(void) {//Defining Arrays for hostfloat h_in[N], h_out[N];//Defining Pointers for devicefloat *d_in, *d_out;int h_f = 2;int h_g = 20;// allocate the memory on the cpucudaMalloc((void**)&d_in, N * sizeof(float));cudaMalloc((void**)&d_out, N * sizeof(float));//Initializing Arrayfor (int i = 0; i < N; i++) {h_in[i] = i;}//Copy Array from host to devicecudaMemcpy(d_in, h_in, N * sizeof(float), cudaMemcpyHostToDevice);//Copy constants to constant memorycudaMemcpyToSymbol(constant_f, &h_f, sizeof(int),0,cudaMemcpyHostToDevice);cudaMemcpyToSymbol(constant_g, &h_g, sizeof(int));//Calling kernel with one block and N threads per blockgpu_constant_memory << <1, N >> >(d_in, d_out);//Coping result back to host from device memorycudaMemcpy(h_out, d_out, N * sizeof(float), cudaMemcpyDeviceToHost);//Printing result on consoleprintf("Use of Constant memory on GPU \n");for (int i = 0; i < N; i++) {printf("The expression for input %f is %f\n", h_in[i], h_out[i]);}//Free up memorycudaFree(d_in);cudaFree(d_out);return 0;
}

2. 纹理内存
- 纹理内存时另外一种当数据的访问具有特定的模式的时候能够加速程序执行,并减少显存带宽的制度存储器,像常量内存一样,它也在芯片内部被
cache缓冲 - 该存储器最初是为了图像绘制而设计的,但也可以被用于通过计算
- 当程序进行具有很大程序上的空间临近性的访存的时候,这种存储器变得非常高效。空间临近性的意思是:每个现成的读取位置都和其他现成的读取位置临近,这对那些需要处理4个临近的相关点和8个临近的点的图像处理应用非常有用。一种线程进行2D的平面空间临近性的访存的例子,可能会像下表:

- 通用的全局内存的
cache将不能有效处理这种空间临近性,可能会导致进行大量的显存读取传输。纹理存储器被设计成能够利用这种方寸模型,这样它只会从显存读取1次,然后缓冲掉,因此执行速度会快得多 - 纹理内存支持2D和3D的纹理读取操作,但编程可能没有那么容易
- 下边给出一个通过纹理内存进行数组赋值的例子:
#include "stdio.h"
#include<iostream>
#include <cuda.h>
#include <cuda_runtime.h>
#define NUM_THREADS 10
#define N 10//纹理内存定义
texture <float, 1, cudaReadModeElementType> textureRef;
__global__ void gpu_texture_memory(int n, float *d_out)
{int idx = blockIdx.x*blockDim.x + threadIdx.x;if (idx < n) {float temp = tex1D(textureRef, float(idx));d_out[idx] = temp;}
}int main()
{//Calculate number of blocks to launchint num_blocks = N / NUM_THREADS + ((N % NUM_THREADS) ? 1 : 0);//Declare device pointerfloat *d_out;// allocate space on the device for the resultcudaMalloc((void**)&d_out, sizeof(float) * N);// allocate space on the host for the resultsfloat *h_out = (float*)malloc(sizeof(float)*N);//Declare and initialize host arrayfloat h_in[N];for (int i = 0; i < N; i++) {h_in[i] = float(i);}//Define CUDA ArraycudaArray *cu_Array;cudaMallocArray(&cu_Array, &textureRef.channelDesc, N, 1);//Copy data to CUDA Array,(0,0)表示从左上角开始cudaMemcpyToArray(cu_Array, 0, 0, h_in, sizeof(float)*N, cudaMemcpyHostToDevice);// bind a texture to the CUDA arraycudaBindTextureToArray(textureRef, cu_Array);//Call Kernel gpu_texture_memory << <num_blocks, NUM_THREADS >> >(N, d_out);// copy result back to hostcudaMemcpy(h_out, d_out, sizeof(float)*N, cudaMemcpyDeviceToHost);printf("Use of Texture memory on GPU: \n");for (int i = 0; i < N; i++) {printf("Texture element at %d is : %f\n",i, h_out[i]);}free(h_out);cudaFree(d_out);cudaFreeArray(cu_Array);cudaUnbindTexture(textureRef);}
- 纹理引用是通过
texture<>类型的变量进行定义的,定义是的三个参数意思是:
texture <p1, p2, p3> textureRef;
p1: 纹理元素的类型
p2: 纹理引用的类型,可以是1D,2D,3D的
p3:读取模式,是个可选参数,用来说明是否要执行读取时候的自动类型转换
- 一定要确保纹理引用被定义成全局静态变量,同时还要确保它不能作为参数传递给任何其他函数
cudaBindTextureToArray函数将纹理引用和CUDA数组进行绑定- 运行结果如下:

- ------ end------
相关文章:
[7] CUDA之常量内存与纹理内存
CUDA之常量内存与纹理内存 1. 常量内存 NVIDIA GPU卡从逻辑上对用户提供了 64KB 的常量内存空间,可以用来存储内核执行期间所需要的恒定数据常量内存对一些特定情况下的小数据量的访问具有相比全局内存的额外优势,使用常量内存也一定程序上减少了对全局…...
python使用base加密解密
原理 base编码是一种加密解密措施,目前常用的有base16、base32和base64。其大致原理比较简单。 以base64为例,base64加密后共有64中字符。其加密过程是编码后将每3个字节作为一组,这样每组就有3*824位。将每6位作为一个单位进行编码…...
简述vue.mixin的使用场景和原理
Vue.mixin的使用场景 Vue.mixin是Vue的全局混入功能,它提供了一种非常灵活的方式来分发Vue组件中的可复用功能。使用Vue.mixin可以为Vue实例和组件添加全局的方法、属性、钩子函数等。具体的使用场景包括: 全局设置默认属性或方法:例如&…...
C# WPF入门学习(四)—— 按钮控件
上期介绍了WPF的实现架构和原理,之后我们开始来使用WPF来学习各种控件。 一、尝试插入一个按钮(方法一) 1. VS2019 在界面中,点击工具栏中的视图,在下拉菜单中选择工具箱。 至于编译器中的视图怎么舒服怎么来布置&am…...
大模型效能工具之智能CommitMessage
01 背景 随着大型语言模型的迅猛增长,各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面,也出现了一系列贯穿全流程的提效和质量工具,比如针对成本较高的Oncall,首先出现了高质量的RAG助手;在开…...
PyQt6--Python桌面开发(33.QToolBar工具栏控件)
QToolBar工具栏控件...
node环境问题(无法加载文件D:\Software\Node.js\node_global\vue.ps1,因为在此系统上禁止运行脚本。)
问题:npm安装lerna显示安装成功,但是lerna -v的时候报错 解决步骤: 1、输入:Get-ExecutionPolicy 2、输入:Set-ExecutionPolicy -Scope CurrentUser(有选项的选Y) 3、输入:RemoteSi…...
位运算算法
位运算是计算机中常用的一种运算方法,它直接对二进制数的位进行操作。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<&a…...
重学java 45.多线程 下 总结 定时器_Timer
人开始反向思考 —— 24.5.26 定时器_Timer 1.概述:定时器 2.构造: Timer() 3.方法: void schedule(TimerTask task, Date firstTime, long period) task:抽象类,是Runnable的实现类 firstTime:从什么时间开始执行 period:每隔多长时间执行一次…...
MongoDB(介绍,安装,操作,Springboot整合MonggoDB)
目录 MongoDB 1 MongoDB介绍 MongoDB简介 MongoDB的特点 MongoDB使用场景 小结 2 MongoDB安装 安装MongoDB 连接MongoDB MongoDB逻辑结构 MongoDB数据类型 小结 3 MongoDB操作 操作库和集合 操作文档-增删改 操作文档-查询 MongoDB索引 小结 4 SpringBoot整合…...
【数字移动通信】期末突击
文章目录 复习题一.简答题1、常用的移动通信系统有哪些?2、分别列出1G,2G,3G,4G的典型系统或标准?3、移动通信信道的基本特征?4、电波传播预测模型是用来计算什么量的,在选择传播预测模型时,主要考虑哪些因素?5、什么…...
数据库(5)——DDL 表操作
表查询 先要进入到某一个数据库中才可使用这些指令。 SHOW TABLES; 可查询当前数据库中所有的表。 表创建 CREATE TABLE 表名( 字段1 类型 [COMMENT 字段1注释] ...... 字段n 类型 [COMMENT 字段n注释] )[COMMENT 表注释]; 例如,在student数据库里创建一张studen…...
【Java EE】网络协议——HTTP协议
目录 1.HTTP 1.1HTTP是什么 1.2理解“应用层协议” 1.3理解HTTP协议的工作过程 2.HTTP协议格式 2.1抓包工具的使用 2.2抓包工具的原理 2.3抓包结果 3.协议格式总结 1.HTTP 1.1HTTP是什么 HTTP(全称为“超文本传输协议”)是一种应用非常广泛的应…...
Docker提示某网络不存在如何解决,添加完网络之后如何删除?
Docker提示某网络不存在如何解决? 创建 Docker 网络 假设现在需要创建一个名为my-mysql-network的网络 docker network create my-mysql-network运行容器 创建网络之后,再运行 mysqld_exporter 容器。完整命令如下: docker run -d -p 9104…...
C++ 红黑树
目录 1.红黑树的概念 2.红黑树的性质 3.红黑树节点的定义 4.红黑树的插入操作 5.数据测试 1.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…...
PTA 6-4 配对问题
许多大学生报名参与大运会志愿者工作。其中运动场引导员需要男女生组队,每组一名男生加一名女生,男生和女生各自排成一队,依次从男队和女队队头各出一人配成小组,若两队初始人数不同,则较长那一队未配对者调到其他志愿…...
sklearn基础教程
scikit-learn是一个用于机器学习的Python库,提供了多种机器学习的方法和模型,以及数据预处理、特征选择、模型评估等功能。它简化了机器学习流程,并且具有易于使用和灵活的特点。 本教程将介绍sklearn的基础知识和常用功能,帮助你…...
MySQL入门学习-查询进阶.别名
别名(Alias)是为数据库中的表、列或表达式赋予的一个临时名称。使用别名可以使查询结果更具可读性,并且在复杂的查询中更方便地引用和处理数据。 在 MySQL 中,别名可以通过 AS 关键字来定义,例如: SELECT…...
【Rust日报】嵌入式 Rust:一份简化指南
EvilHelix 编辑器 EvilHelix 是一个采用 Vim 风格的模态编辑器,旨在提供快速且高效的编辑体验。它是 Helix 编辑器的一个分支,增加了 Vim binding,同时积极同步上游的特性,兼备了 Vim 和 Hexli 的优点: Vim 风格的模态…...
Web课外练习9
<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>邮购商品业务</title><!-- 引入vue.js --><script src"./js/vue.global.js" type"text/javascript"></script><link rel&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
