CUDA 学习(十二)、常量内存

一、概述

       常量内存其实只是全局内存的一种虚拟地址形式,并没有特殊保留的常量内存块。常量内存有两个特征,一个是高速缓存,另一个是它支持将单个值广播到线程束中的每个线程。

       常量内存,通过名字我们就能猜到它是只读内存。这种类型的内存要么是在编译时声明为只读内存,要么是在运行时通过主机端定义为只读内存。常量只是从GPU内存的角度而言。常量内存大小被限制为64K。

      在编译时声明一块常量内存,需要用到__constant__ 关键字。

      如果要在运行时改变常量内存区中的内容,只需在调用GPU内核之前简单地调用cudaCopyToSymbol 函数。如果在编译阶段或主机端运行阶段没有定义常量内存,那么常量内存区将未定义。


二、常量内存高速缓存

1、在计算能力为1.x 的设备

     在计算能力为1.x 的设备上,常量内存有一个特性,就是将数据缓存到一块8KB 的一级缓存上,使随后的访问变得更加快速。但前提是内存中的数据可能在程序中重复利用。此外,广播访问也被高度优化,使得访问相同内存地址的线程能够在单个期间内完成。

2、在计算能力为2.x 的设备

     在费米架构的设备以及后续发布的设备上出现了二级缓存。费米架构设备上的二级缓存可以在SM之间进行共享。所有的内存访问将自动地缓存到二级缓存中。对任何声明为常量的内存区进行基于非线程的访问都将通过常量缓存。所谓的基于非线程的访问,即对所访问的数组的索引进行计算时不需要用到 threadIdx.x。


三、常量内存广播机制

      常量内存有一个非常有用的特性,该特性主要将数据分配或广播到线程束的每个线程中。广播能在单个周期内发生,因此,该特性非常有用。

      在基于二级缓存访问机制的费米设备上,同样可以使用广播机制,通过广播机制,我们可以快速的将数据分配到线程束的多个线程中。每个线程从常量内存读取元素N,这样会触发广播机制,在读到数据之后广播到线程束中的每个线程。由于常量内存区几乎可以到达与一级缓存相同的速度,因此这类算法使用常量内存性能非常好。

      然而,需要特别注意的是,如果一个常量只是字面值,那么最好用 #define 对字面值进行定义,因为这样可以减少常量内存的使用。


四、运行时进行常量内存更新

       GPU 上的常量内存并不是真正意义上的常量内存,因为GPU上并没有专门常量内存预留特殊内存区。由于常量内存是通过16位地址进行访问的,而16位地址能够快速进行访问,因此常量内存最大限制为64KB。这样做会带来一定好处但也会带来一些问题。首先,通过调研cudaMemcpyToSymbol 函数,常量内存可以按块或片的形式进行更新,一次最多能更新64K。

      注意cudaMemcpyToSymbol 函数的工作原理。该函数可以将数据复制到GPU上任何以全局符合命名的内存区域,无论该符号是全局内存还是常量内存。因此,我们可以将一块64K大小的数据复制到一个64K 大小内存区上,从而通过常量内存缓存进行访问。当所有线程访问同一数据元素时,这种访问方式非常有用,因为我们可以借助缓存技术从常量内存区获取然后在广播到每个线程中。












  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于学习 CUDA C 的指南,我推荐以下步骤: 1. 学习 CUDA 基础知识:首先,你需要了解 CUDA 平台的基本概念和架构。学习 CUDA 编程前,建议先熟悉 GPU 的工作原理、并行计算等基本概念。 2. 学习 C/C++ 语言:CUDA C 是在 C/C++ 语言的基础上进行扩展的,因此你需要熟悉 C/C++ 的语法和基本的编程概念。如果你已经熟悉 C/C++,可以跳过这一步。 3. 安装 CUDA 工具包:在开始编写 CUDA C 代码之前,你需要安装 CUDA 工具包。CUDA 工具包包含了编译器、调试器和其他必要的工具。 4. 学习 CUDA 编程模型:CUDA 提供了一种并行计算模型,其中核心概念是将任务分配给多个线程执行。了解 CUDA 编程模型将帮助你正确地编写并行化的代码。 5. 编写第一个 CUDA 程序:通过编写一个简单的 CUDA 程序来加深对 CUDA 编程的理解。你可以从一些基本的向量加法或矩阵乘法开始。 6. 学习 CUDA内存模型:CUDA 提供了多种内存类型,包括全局内存、共享内存常量内存等。了解这些内存类型的特性和使用方法对于优化 CUDA 程序至关重要。 7. 优化 CUDA 程序:学习如何通过合理的算法选择、内存访问模式优化和使用 CUDA 提供的优化技术来提高 CUDA 程序的性能。 8. 深入研究 CUDA 相关主题:学习 CUDA 的高级主题,如动态并行、异步执行、CUDA 模板库(Thrust)等,以及与其他库(如 cuDNN、cuBLAS)的集成。 在学习过程中,可以参考 NVIDIA 官方文档和教程,例如 CUDA C Programming Guide,以及一些优秀的 CUDA 编程书籍和在线资源。同时,尝试编写一些简单的 CUDA 应用程序并实践,通过实践来巩固所学知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值