8. 性能指标

博客补充:CUDA C++ 最佳实践指南-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_62704693/article/details/141267262?spm=1001.2014.3001.5502

在尝试优化 CUDA 代码时,了解如何准确测量性能并了解带宽在性能测量中的作用是值得的。本章讨论如何使用 CPU 计时器和 CUDA 事件正确测量性能。然后,本文探讨了带宽如何影响性能指标,以及如何缓解它带来的一些挑战。

8.1. 时序

CUDA 调用和内核执行可以使用 CPU 或 GPU 计时器进行计时。本节将介绍这两种方法的功能、优点和缺陷。

8.1.1. 使用 CPU 计时器

任何 CPU 计时器都可用于测量 CUDA 调用或内核执行的运行时间。各种 CPU timing 方法的详细信息不在本文档的讨论范围之内,但开发人员应始终了解其 timing calls 提供的分辨率。

使用 CPU 计时器时,重要的是要记住许多 CUDA API 函数是异步的;也就是说,它们在完成工作之前将控制权返回给调用 CPU 线程。所有内核启动都是异步的,名称上带有后缀的 memory-copy 函数也是如此。因此,要准确测量特定调用或 CUDA 调用序列的运行时间,有必要在启动和停止 CPU 计时器之前立即调用,使 CPU 线程与 GPU 同步。阻塞调用 CPU 线程,直到该线程之前发出的所有 CUDA 调用都完成。Async cudaDeviceSynchronize() cudaDeviceSynchronize()

尽管也可以将 CPU 线程与 GPU 上的特定流或事件同步,但这些同步函数不适用于默认流以外的流中的计时代码。 阻塞 CPU 线程,直到之前向给定流发出的所有 CUDA 调用都已完成。 阻塞,直到 GPU 记录了特定流中的给定事件。由于驱动程序可能会交错执行来自其他非默认流的 CUDA 调用,因此其他流中的调用可能包含在计时中。cudaStreamSynchronize() cudaEventSynchronize()

由于默认流(流 0)表现出设备上工作的序列化行为(默认流中的操作只能在任何流中的所有先前调用完成后开始;并且任何流中的后续操作都不能开始,直到它完成),因此这些函数可以可靠地用于默认流中的计时。

请注意,本节中提到的 CPU 到 GPU 同步点意味着 GPU 的处理管道停顿,因此应谨慎使用,以尽量减少其性能影响。

8.1.2. 使用 CUDA GPU 计时器

CUDA 事件 API 提供了创建和销毁事件、记录事件(包括时间戳)以及将时间戳差异转换为浮点值(以毫秒为单位)的调用。如何使用 CUDA 事件进行计时编码说明了它们的用途。

 如何使用 CUDA 事件对 CUDA 事件进行时间编码

cudaEvent_t start, stop;
float time;cudaEventCreate(&start);
cudaEventCreate(&stop);cudaEventRecord( start, 0 );
kernel<<<grid,threads>>> ( d_odata, d_idata, size_x, size_y,NUM_REPS);
cudaEventRecord( stop, 0 );
cudaEventSynchronize( stop );cudaEventElapsedTime( &time, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );

此处用于将 and 事件放入默认流 stream 0 中。当设备到达流中的事件时,设备将记录事件的时间戳。该函数返回记录 and 事件之间经过的时间。此值以毫秒为单位,分辨率约为半微秒。与此列表中的其他调用一样,CUDA 工具包参考手册中描述了它们的具体操作、参数和返回值。请注意,计时是在 GPU clock 上测量的,因此 timing resolution 与操作系统无关。cudaEventRecord() start stop cudaEventElapsedTime() startstop

8.2. 带宽

带宽 - 数据传输的速率 - 是影响性能的最重要因素之一。几乎所有对代码的更改都应该在它们如何影响带宽的上下文中进行。如本指南的内存优化中所述,带宽可能会受到存储数据的内存选择、数据的布局方式和访问顺序以及其他因素的显著影响。

为了准确测量性能,计算理论带宽和有效带宽非常有用。当后者远低于前者时,设计或实现细节可能会减少带宽,增加带宽应该是后续优化工作的主要目标。

注意

高优先级:在衡量性能和优化优势时,使用计算的有效带宽作为指标。

8.2.1. 理论带宽计算

理论带宽可以使用产品资料中提供的硬件规格来计算。例如,NVIDIA Tesla V100 使用内存时钟速率为 877 MHz 和 4096 位宽内存接口的 HBM2(双倍数据速率)RAM。

使用这些数据项,NVIDIA Tesla V100 的峰值理论内存带宽为 898 GB/s:

(0.877\times 10^{9}\times(4096/8)\times2)\div 10^{9}=898GB/s

在此计算中,内存时钟速率转换为 Hz,乘以接口宽度(除以 8,将位转换为字节),然后由于数据速率翻倍而乘以 2。最后,这个乘积除以10^{9}将结果转换为 GB/s。

注意

某些计算使用 1024^{3}而不是10^{9}进行最终计算。在这种情况下,带宽将为 836.4 GiB/s。在计算理论带宽和有效带宽时,使用相同的除数非常重要,这样比较才有效。

注意

在启用了 ECC 的 GDDR 内存的 GPU 上,可用 DRAM 减少了 6.25%,以允许存储 ECC 位。与禁用 ECC 的同一 GPU 相比,为每个内存事务获取 ECC 位也会将有效带宽减少约 20%,但 ECC 对带宽的确切影响可能更高,并且取决于内存访问模式。另一方面,HBM2 存储器提供专用的 ECC 资源,允许无开销的 ECC 保护。2

8.2.2. 有效带宽计算

有效带宽是通过对特定程序活动进行计时以及了解程序如何访问数据来计算的。为此,请使用以下公式:

Effective\setminus bandwidth=((B_{r}+B_{w})\div 10^{9})\div time

此处,有效带宽以 GB/s、B 为单位r是每个内核读取的字节数 B_{w}是每个内核写入的字节数,时间以秒为单位。

例如,要计算 2048 x 2048 矩阵副本的有效带宽,可以使用以下公式:

Effective\setminus bandwidth=((2048^{2}\times 4\times 2)\div 10^{9})\div time

元素数乘以每个元素的大小(float 为 4 字节),再乘以 2(由于读取写入),再除以 10^{9}(或 1024^{3}) 获取传输的内存 (GB)。此数字除以获得 GB/s 的时间(以秒为单位)。

8.2.3. Visual Profiler 报告的吞吐量

对于计算能力为 2.0 或更高的设备,Visual Profiler 可用于收集多种不同的内存吞吐量度量。以下吞吐量指标可以显示在 Details (详细信息) 或 Detail Graphs (详细信息图表) 视图中:

  • 请求的全局负载吞吐量

  • 请求的 Global Store 吞吐量

  • 全局负载吞吐量

  • 全球商店吞吐量

  • DRAM 读取吞吐量

  • DRAM 写入吞吐量

Requested Global Load Throughput 和 Requested Global Store Throughput 值表示内核请求的全局内存吞吐量,因此对应于 Effective Bandwidth Calculation 下显示的计算获得的有效带宽。

由于最小内存事务大小大于大多数字大小,因此内核所需的实际内存吞吐量可以包括内核未使用的数据传输。对于全局内存访问,此实际吞吐量由 Global Load Throughput (全局负载吞吐量) 和 Global Store Throughput (全局存储吞吐量) 值报告。

请务必注意,这两个数字都很有用。实际内存吞吐量显示代码与硬件限制的接近程度,并且将有效带宽或请求带宽与实际带宽进行比较,可以很好地估计内存访问的次优合并所浪费的带宽量(请参阅 对全局内存的合并访问)。对于全局内存访问,请求的内存带宽与实际内存带宽的比较由 Global Memory Load Efficiency (全局内存负载效率) 和 Global Memory Store Efficiency (全局内存存储效率) 指标报告。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460251.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!

【Stable Diffusion - Ai】小白入门必看&#xff08;涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇&#xff09;&#xff01;真材实料&#xff01;不卖课&#xff01;&#xff01;&#xff01; 在上一篇 小白入门必看&#xff08;图生图篇&#xff09;中我们详细的介绍了文生图和图生…

Linux字体更新 使用中文字体

问题描述&#xff0c;处理之前&#xff0c;中文乱码 处理后的结果 压缩需要上传的字体&#xff1a; 上传到LInux的字体目录&#xff0c;上传后解压出来 刷新字体&#xff1a; fc-cache -fv 测试是否正常 fc-list | grep "FontName"如果还不行 可以在代码里面指定字…

信息安全工程师(72)网络安全风险评估概述

前言 网络安全风险评估是一项重要的技术任务&#xff0c;它涉及对网络系统、信息系统和网络基础设施的全面评估&#xff0c;以确定存在的安全风险和威胁&#xff0c;并量化其潜在影响以及可能的发生频率。 一、定义与目的 网络安全风险评估是指对网络系统中存在的潜在威胁和风险…

Kafka 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …

CH569开发前的测试

为了玩转准备Ch569的开发工作 &#xff0c;准备了如下硬件和软件&#xff1a; 硬件 1.官方的 Ch569 开发板&#xff0c;官方买到的是两块插接在一起的&#xff1b;除了HSPI接口那里的电阻&#xff0c;这两块可以说是一样的。也意味着两块板子的开发也需要烧录两次&#xff1b…

OpenCV基本操作(python开发)——(7)实现图像校正

OpenCV基本操作&#xff08;python开发&#xff09;——&#xff08;1&#xff09; 读取图像、保存图像 OpenCV基本操作&#xff08;python开发&#xff09;——&#xff08;2&#xff09;图像色彩操作 OpenCV基本操作&#xff08;python开发&#xff09;——&#xff08;3&…

ffmpeg视频滤镜:网格-drawgrid

滤镜介绍 drawgrid 官网链接 》 FFmpeg Filters Documentation drawgrid会在视频上画一个网格。 滤镜使用 参数 x <string> ..FV.....T. set horizontal offset (default "0")y <string> ..FV.....T. set…

使用pytorch实现LSTM预测交通流

原始数据&#xff1a; 免费可下载原始参考数据 预测结果图&#xff1a; 根据测试数据test_data的真实值real_flow&#xff0c;与模型根据测试数据得到的输出结果pre_flow 完整源码&#xff1a; #!/usr/bin/env python # _*_ coding: utf-8 _*_import pandas as pd import nu…

Oracle视频基础1.1.3练习

1.1.3 需求&#xff1a; 完整格式查看所有用户进程里的oracle后台进程 查看物理网卡&#xff0c;虚拟网卡的ip地址 ps -ef | grep oracle /sbin/ifconfig要以完整格式查看所有用户进程中的 Oracle 后台进程&#xff0c;并查看物理和虚拟网卡的 IP 地址&#xff0c;可以使用以下…

【数据集】MODIS地表温度数据(MOD11)

【数据集】MODIS地表温度数据(MOD11) 数据概述MYD11A2数据下载MYD11A2 v006MYD11A2 v061参考MODIS(Moderate Resolution Imaging Spectroradiometer)是美国国家航空航天局(NASA)和美国国家海洋和大气管理局(NOAA)联合开发的一种遥感仪器,搭载于Terra和Aqua卫星上。MOD…

SpringBoot最佳实践之 - 项目中统一记录正常和异常日志

1. 前言 此篇博客是本人在实际项目开发工作中的一些总结和感悟。是在特定需求背景下&#xff0c;针对项目中统一记录日志(包括正常和错误日志)需求的实现方式之一&#xff0c;并不是普适的记录日志的解决方案。所以阅读本篇博客的朋友&#xff0c;可以参考此篇博客中记录日志的…

2024年优秀的天气预测API

准确、可操作的天气预报对于许多组织的成功至关重要。 事实上&#xff0c;在整个行业中&#xff0c;天气条件会直接影响日常运营&#xff0c;包括航运、按需、能源和供应链&#xff08;仅举几例&#xff09;。 以公用事业为例。根据麦肯锡的数据&#xff0c;在 1.4 年的时间里…

Tenda路由器 敏感信息泄露

0x01 产品描述&#xff1a; ‌ Tenda路由器‌是由深圳市吉祥腾达科技有限公司&#xff08;Tenda&#xff09;生产的一系列网络通信产品。Tenda路由器以其高性能、高性价比和广泛的应用场景而闻名&#xff0c;适合家庭、办公室和各种网络环境。0x02 漏洞描述&#xff1a…

net mvc中使用vue自定义组件遇到的坑

自定义一个ButtonCounter.js组件 export default {data() {return {count: 0}},template: <van-button type"primary" click"count">You clicked me {{ count }} times.</van-button> }按照官网文档的意思&#xff0c;组件命名需要大写驼峰命…

Python第六次作业

01.求第n项的斐波那契数列值 #求第n项的斐波那契数列值 #1、1、2、3、5、8、13、21、34…… #F(0)0&#xff0c;F(1)1, F(n)F(n - 1)F(n - 2)&#xff08;n ≥ 2&#xff0c;n ∈ N*&#xff09;def shulie ():print("求第n项的斐波那契数列值:",end"")xev…

Vue3 学习笔记(十三)Vue组件详解

1、组件&#xff08;Component&#xff09; 介绍 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;可以帮助你将用户界面拆分成独立和可复用的部分。 每个 Vue 组件都是一个独立的 Vue 实…

MySQL基础(二)

目录 一. 数据库命令行基本操作指令 1. 查看当前有哪些数据库——show databases; 2. 创建数据库——create database 数据库名 charset utf8 3. 选中数据库——use 数据库名; 4. 删除数据库——drop database 数据库名; 二. 常用数据类型 2.1 数值类型 2.2. 字符串类型 …

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

深度学习案例:带有一个隐藏层的平面数据分类

该案例来自吴恩达深度学习系列课程一《神经网络和深度学习》第三周编程作业&#xff0c;作业内容是设计带有一个隐藏层的平面数据分类。作业提供的资料包括测试实例&#xff08;testCases.py&#xff09;和任务功能包&#xff08;planar_utils.py&#xff09;&#xff0c;下载请…

SD教程 重绘 ControlNet-Inpain

SD教程 重绘 ControlNet-Inpain ———————————————— 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。原文链接&#xff1a;https://blog.csdn.net/A1353192296/article/details/13…