CUDA实践指南(九)

简介:

带宽:
带宽 - 数据可以传输的速率 - 是性能最重要的门控因素之一。 代码的几乎所有变化都应该在它们如何影响带宽的情况下进行。 带宽可能会因数据存储的内存选择,数据布局方式以及访问顺序以及其他因素而受到显着影响。
要准确测量性能,计算理论和有效带宽非常有用。 当后者远低于前者时,设计或实现细节可能会降低带宽,并且应该成为后续优化工作的主要目标。
高优先级:在衡量性能和优化优势时,使用计算的有效带宽作为度量标准。
理论带宽计算:
理论带宽可以使用产品文献中提供的硬件规格进行计算。 例如,NVIDIA Tesla M2090使用GDDR5(双倍数据速率)RAM,存储器时钟频率为1.85 GHz,存储器接口为384位。
使用这些数据项,NVIDIA Tesla M2090的最高理论内存带宽为177.6 GB / s
$(1.85times10^{9}times(384/8)times2)div10^{9}=177.6GB/s
$
在此计算中,由于双倍数据速率,存储器时钟速率被转换为Hz,乘以接口宽度(除以8,将位转换为字节)并乘以2。 最后,此产品除以$10^{9}$以将结果转换为GB / s。
一些计算使用$1024^3$而不是$10^9$进行最终计算。 在这种情况下,带宽将达到165.4GB / s。 计算理论和有效带宽时使用相同的除数很重要,以便比较有效。
启用ECC后,由于内存校验和的额外流量,有效最大带宽减少了大约20%,但ECC对带宽的确切影响取决于内存访问模式。
有效带宽计算:
有效带宽是通过定时特定的程序活动以及了解程序如何访问数据来计算的。 为此,请使用以下等式:
$Effective bandwidth=((B_{r}+B_{w})\div10^{9})\div time$
这里,有效带宽以GB / s为单位,$B_{r}$是每个内核读取的字节数,$B_{w}$是每个内核写入的字节数,时间以秒为单位。
例如,要计算2048 x 2048矩阵副本的有效带宽,可以使用以下公式:
$Effective bandwidth=((2048^{2}\times4\times2)\div 10^{9})\div time$
元素数量乘以每个元素的大小(浮点数为4个字节)乘以2(因为读取和写入),再除以$10^{9}$(或$1,024^3$)以获得传输的内存GB。 这个数字除以获得GB / s的秒数。
吞吐量由Visual Profiler报告:
对于计算能力为2.0或更高的设备,Visual Profiler可用于收集多个不同的内存吞吐量度量。 以下吞吐量指标可显示在“详细信息”或“详细信息图”视图中:

  • Requested Global Load Throughput
  • Requested Global Store Throughput
  • Global Load Throughput
  • Global Store Throughput
  • DRAM Read Throughput
  • DRAM Write Throughput

请求的全局负载吞吐量和请求的全局存储吞吐量值指示内核请求的全局内存吞吐量,因此对应于有效带宽计算下显示的计算所获得的有效带宽。
由于最小内存事务大小大于大多数字大小,因此内核所需的实际内存吞吐量可能包括未被内核使用的数据传输。 对于全局内存访问,此实际吞吐量由全局负载吞吐量和全局存储吞吐量值报告。
请注意,这两个数字都很有用。 实际的内存吞吐量显示了代码与硬件限制有多接近,并且将有效或请求的带宽与实际带宽进行比较,可以很好地估计由于存储访问次优联合而浪费了多少带宽。 对于全局内存访问,请求内存带宽与实际内存带宽的比较由全局内存负载效率和全局内存存储效率度量标准报告。

目录
相关文章
|
编解码 NoSQL 数据可视化
一个现代化轻量级的跨平台Redis桌面客户端
一个现代化轻量级的跨平台Redis桌面客户端
460 0
|
Ubuntu Linux
Linux:查看服务器信息,CPU、内存、系统版本、内核版本等
Linux:查看服务器信息,CPU、内存、系统版本、内核版本等
6884 0
Linux:查看服务器信息,CPU、内存、系统版本、内核版本等
|
网络协议 Linux C++
《C++ 网络编程:高效实现 TCP/IP 与 UDP 通信》
在数字化时代,网络编程对C++开发者至关重要。本文深入探讨了C++中TCP/IP和UDP通信的高效实现,涵盖网络编程基础、TCP连接建立、I/O模型选择、数据传输优化、连接维护与关闭、UDP特点利用及数据报优化等内容,旨在帮助开发者构建高性能的网络应用程序。
679 21
|
网络协议 Shell Linux
Shell脚本配置Centos静态ip地址
这是一个用于在CentOS上设置静态IP的Shell脚本摘要: - 脚本交互式获取用户输入的IP地址、子网掩码、网关和DNS。 - 使用`sed`命令动态更新`/etc/sysconfig/network-scripts/ifcfg-ENS33`配置文件。 - 修改`BOOTPROTO`为`static`,并设置IP、NETMASK、GATEWAY和DNS1字段。 - 用`systemctl restart network`重启网络服务。 - 提示用户新配置的静态IP信息。
450 5
|
存储 NoSQL Java
【面试宝藏】Redis 常见面试题解析
Redis 是内存数据结构存储系统,用作数据库、缓存和消息中间件,支持字符串、哈希、列表等数据类型。它的优点包括高性能、原子操作、持久化和复制。相比 Memcached,Redis 提供数据持久化、丰富数据结构和发布/订阅功能。Redis 采用单线程模型,但通过 I/O 多路复用处理高并发。常见的面试问题涉及持久化机制、过期键删除、回收策略、集群和客户端等。
370 4
|
弹性计算 负载均衡 网络协议
云计算中的弹性伸缩与负载均衡技术解析
【7月更文挑战第4天】弹性伸缩与负载均衡作为云计算平台中的两大关键技术,对于构建高可用、可扩展的应用系统具有重要意义。通过合理利用这两种技术,企业可以灵活应对不断变化的业务需求,降低运营成本,提高资源利用效率。未来,随着技术的不断进步和应用的深入,弹性伸缩与负载均衡技术将在更多领域发挥重要作用,推动云计算技术的持续发展。
|
Cloud Native API 云计算
云原生架构的深度探索与实践####
本文深入探讨了云原生架构的核心概念、技术特点及其在现代软件开发中的应用实践。通过分析云原生架构如何促进企业数字化转型,提升业务敏捷性与可扩展性,本文旨在为读者提供一个全面而深入的理解框架。我们将从云原生的定义出发,逐步深入到其关键技术组件、最佳实践案例及面临的挑战与解决方案,为开发者和企业决策者提供宝贵的参考与启示。 ####
|
机器学习/深度学习 数据采集 算法
Python实现Prophet时间序列数据建模与异常值检测(Prophet算法)项目实战
Python实现Prophet时间序列数据建模与异常值检测(Prophet算法)项目实战
|
Dart Shell API
FlutterEngine 桌面端架构浅析
FlutterEngine 桌面端架构浅析
752 0
FlutterEngine 桌面端架构浅析
|
存储 缓存 并行计算
【CUDA学习笔记】第四篇:线程以及线程同步(附案例代码下载方式)(一)
【CUDA学习笔记】第四篇:线程以及线程同步(附案例代码下载方式)(一)
870 0