CUDA学习笔记(四)——常量内存&纹理内存

本文探讨了常量内存在CUDA编程中的作用,如何通过广播和缓存提高性能,以及纹理内存的区别。重点在于如何利用__constant__修饰符和cudaMemcpyToSymbol进行高效操作,适用于计算密集型应用如图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常量内存

常量内存是用于存储代码执行期间不会发生改变的数据,其不同于全局内存,使用常量内存替换全局内存能有效的减少内存带宽。常量内存资源一般只有64k,所以是比较稀缺的资源。
其主要原因:

  • 对常量内存的单次读操作可以广播到相邻的线程,相当于一次读取,16个线程都能获取到该数据。
  • 发生读操作后,常量内存将会被缓存起来,相同的读取操作将不会再产生额外的内存通信量。

在CUDA架构中,线程束指的是一个32线程的集合,在这个集合中的线程,将会LockStep(步调一致)的形式执行。而nvidia硬件会把单次的读操作广播到每个半线程束(half-warp),也就是16个线程中,也就是,如果在这个half-warp中线程都需要读取同一个常量内存数据,那么只需要读取一次,然后通过广播的形式传递到剩余的线程中。所以这种方式,要比全局内存的读取节省1/16的内存流量。
而这块内存被读取后,会被缓存到GPU上,后面在读取该数据的时候只需要从缓存上读取即可,同样也不再需要额外的内存流量。这样会极大程度上提升性能。
但是如果half-warp中每个线程读取的常量内存地址是不同的,也就意味着需要各自取读取,这样性能反而不如全局内存。

常量内存变量修饰符是__constant__,和C++中const是一样的,被__constant__修饰的变量将不能改变。
其次常量内存拷贝需要使用cudaMemcpyToSymbolcudaMemcpy是拷贝数据至全局内存。

最简单的例子,如果计算中,每个位置上的数据都需要加减一个数据时,就可以使用常量内存。

纹理内存

纹理内存是CUDA中另一种只读内存,广泛应用于OpenGL和DirectX等工具的渲染操作。
纹理内存是专门为那些内存访问中存在大量空间局部性的图形应用程序设计的,同样需要使用cudaBindTexture将变量绑定到纹理内存区域。
我个人主要从事的是图像处理方面的工作,暂时不多做介绍了,后续有需要,再来填坑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值