CUDA实践指南(十四)

简介:

简单的访问模式:
第一个也是最简单的合并案例可以通过任何支持CUDA的设备来实现:第k个线程访问缓存行中的第k个字。 并非所有线程都需要参与。
例如,如果warp访问的线程相邻4字节字(例如,相邻浮点值),单个128B L1高速缓存线并因此单个合并事务将服务该存储器访问。 图3显示了这种模式。
1

如果线的某些字未被任何线程请求(例如,如果多个线程已经访问了相同的字或者某些线程没有参与该访问),则高速缓存线中的所有数据都被获取。 此外,如果在该段内已经对warp线程进行了访问,则只有一个128字节的L1事务将由具有计算能力2.x的设备执行。
顺序但未对齐的访问模式:
如果顺序线程顺序但未与高速缓存线对齐,则会请求两个128字节的L1高速缓存,如图4所示。
2

对于非高速缓存事务(即绕过L1并仅使用L2高速缓存的事务),除32字节L2段的级别外,可以看到类似的效果。 在图5中,我们看到一个例子:使用与图4相同的访问模式,但现在禁用了L1缓存,因此现在需要五个32字节的L2段来满足请求。
3

通过CUDA Runtime API分配的内存(如通过cudaMalloc())保证至少对齐至少256个字节。 因此,选择明显的线程块大小,例如翘曲大小的倍数(即,当前GPU上的32),便于通过与高速缓存线对齐的弯曲进行存储器访问。 (例如,如果线程块大小不是warp大小的倍数,请考虑第二个,第三个和后续线程块访问的内存地址会发生什么情况。)
错位访问的影响:
使用简单的复制内核来探究未对齐的访问的后果是容易的和信息性的,例如复制内核中的一个,它说明未对齐的访问。
说明错位访问的复制内核:

__global__ void offsetCopy(float *odata, float* idata, int offset)
{
    int xid = blockIdx.x * blockDim.x + threadIdx.x + offset;
    odata[xid] = idata[xid];
}

在说明未对齐访问的副本内核中,将数据从输入数组idata复制到输出数组,这两者都存在于全局内存中。 内核在主机代码的循环中执行,该代码将参数偏移量从0改为32.(图4和图4分别对应于缓存和非缓存内存访问情况下的错位)。副本的有效带宽 在NVIDIA Tesla M2090上具有各种偏移量(计算能力2.0,开启了ECC,因为它是默认设置)如图6所示。
对于NVIDIA Tesla M2090,全局内存访问没有偏移或偏移量为32个字的倍数,导致单个L1高速缓存线事务或4个L2高速缓存段负载(用于非L1高速缓存负载)。 实现的带宽约为130GB / s。 否则,每个warp都会加载两个L1高速缓存行(高速缓存模式)或者四个到五个L2高速缓存段(非高速缓存模式),从而实现了无偏移量的约四分之一的内存吞吐量。
有趣的一点是,我们可能预期缓存情况比此示例的非缓存情况更差,因为缓存情况下的每个翘曲都会按需要获取两倍的字节数,而在非缓存情况下, 5/4根据需要获取的字节数是按每个warp获取的。 然而,在这个特殊的例子中,这种效果并不明显,因为相邻的经线会重复使用它们的邻居所获取的缓存线。 因此,虽然缓存负载的影响仍然很明显,但并不像我们预期的那么好。 如果相邻的经线没有表现出超高速缓存线的高度重用,情况会更加如此。

目录
相关文章
|
网络协议 网络架构
|
10月前
|
人工智能 开发框架 小程序
“体重管理年”AI运动应用开发解决方案推荐
为响应国家“体重管理年”号召,单位可借助AI运动识别技术,通过小程序或APP开展职工健身管理。支持日常锻炼记录、线上打卡、竞赛比拼等场景,实现运动自动计数、数据可视化与榜单激励。利用“AI运动识别插件”,可快速开发定制系统;也可选用成熟SaaS平台,低成本高效落地,助力全民健康行动。
|
缓存 Java Serverless
Golang中的闭包详解
Golang中的闭包详解
Motrix教程来了!让你的下载不限速!全网最仔细的教程来咯!
Motrix是一款高效、简洁的下载工具,支持HTTP、FTP、BT等多种协议,具备智能分片、断点续传、批量下载等功能,适用于电影、游戏、文档等各类文件高速下载,提升用户下载体验。
1736 0
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
952 60
|
机器学习/深度学习 人工智能 算法
《AI重塑无线网络:化解信号干扰与波动难题》
无线网络在数字化时代至关重要,但信号干扰与波动(如同频干扰、邻频干扰及物理环境变化等)严重影响性能。传统方法虽能缓解部分问题,但在复杂动态环境中效果有限。人工智能的引入,通过机器学习和强化学习,实现了智能信道选择、功率控制及干扰消除,显著提升网络稳定性与效率。实际应用中,智能工厂和大型商场的案例证明了AI技术的有效性。未来,随着AI不断发展并与其他技术融合,无线网络将更稳定高效,为用户带来更优体验。
839 5
|
存储 人工智能 分布式计算
阿里云云数据仓库:助力企业构建智能数据基石的云端利器 。阿里云云数据仓库优势与选型指南
阿里云数据仓库体系基于MaxCompute、AnalyticDB等核心产品,提供弹性敏捷的PB级数据处理能力,支持实时分析与智能决策。其六大优势包括无限弹性伸缩、极致性能表现、智能成本优化、全栈安全体系、生态无缝对接和AI增强分析,助力企业在数字经济时代应对数据爆发式增长的挑战。灵活透明的定价体系和行业实践案例展示了其在证券、新零售、物联网等领域的成功应用,为企业构建智能数据基座提供了清晰路径。
728 6
|
Rust JavaScript 前端开发
【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
3440 0
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
1436 2

热门文章

最新文章