问题标签 [nvprof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1624 浏览

cuda - 我的 CUDA nvprof 'API Trace' 和 'GPU Trace' 不同步 - 怎么办?

我正在使用 CUDA 7.0 分析器nvprof来分析一些进行 CUDA 调用的过程:

后来,我生成了两个跟踪:“API 跟踪”(主机 CPU 上发生的情况,例如 CUDA 运行时调用和您标记的范围)和“GPU 跟踪”(内核执行、memset、H2D、D2H 等):

每个跟踪中的每条记录都有一个时间戳(或开始和结束时间)。问题是,这两个 trace 中的时间值 0 并不相同:GPU trace time-0 点似乎表示相关进程触发的 GPU 上的第一个操作开始执行的时间,而 API trace 的 time-0 点似乎是流程执行的开始,或者某个时候。

我还注意到,当我使用nvvp和导入时out.nvprof时,值被更正了,也就是说,第一个 GPU 操作的开始时间不是 0,而是更现实的东西。

如何获得两条迹线之间的正确偏移量?

0 投票
1 回答
4077 浏览

cuda - 了解 CUDA 分析器输出 (nvprof)

我只是在查看以下输出并试图围绕这些数字思考:

当谈到优化内存访问时,在比较不同的实现时我真正需要查看哪些数字?它首先看起来像memcpy只需要117.53+107.32ms(在两个方向上),但随后有这个 API 调用cudaMemcpy: 41.8256s,这要多得多。此外,上下输出块之间的 min/avg/max 列不会相加。

为什么会有差异,什么是对我优化内存传输很重要的“真实”数字?

编辑:第二个问题是:有没有办法找出谁在打电话axpy_kernel_val(以及多少次)?

0 投票
0 回答
888 浏览

caching - 如何解释 cuda 带宽受限内核的 nvprof 结果?

我正在运行一些 GPU 基准测试来了解如何最大化来自/到全局内存的内存带宽。我有一个 128 MB(32*1024*1024 单精度浮点数)的数组,对齐到 128 字节的边距,在实际数据之前和之后有三个光环值。因此,数组中的第一个元素与 128 字节边界对齐。

在下文中,n指的是我的数组中的元素个数(不包括光环):n = 32*1024*1024. m指的是数组中的 128 字节字:m = 1024*1024 = 1048576.

我也有一个类似的输出数组,它对齐到相同的边界并且不包含光环。

我有几个内核,它们使用不同的访问模式实现了所有类似的计算:

所有这些计算显然都受带宽限制。我正在尝试优化全局内存事务。我使用的代码非常简单:

我每个块有 1024 个线程和正确数量的块,这样每个线程都被分配了一个输出数组的值。

我使用缓存和非缓存选项 ( -Xptxas -dclm={ca,cg}) 进行了编译,并使用 nvprof 进行了基准测试,提取了以下指标:

  • ldst_issued:发布加载/存储指令
  • ldst_executed:执行的加载/存储指令
  • gld_transactions: 全局加载事务
  • gst_transactions: 全球店铺交易
  • dram_read_throughput:设备内存读取吞吐量
  • dram_write_throughput:设备内存写入吞吐量

我使用的 GPU 是 Nvidia K20X。

我希望ldst_executed(k+1) * m,其中 k 对于 P1 是 1,对于 P2 是 2,对于 P3 是 3,并且表示每个线程读取的值的数量。我还希望gst_transactionsm合并访问:按 128 字节字写入)对于 P1,介于P2m2m P2 之间m以及3mP3 之间的某个地方,因为每个 warp 都必须像 P1 一样访问其“分配”的内存部分,加上以下内容P2 的 128 个字节,加上 P3 的前 128 个字节,但我不确定 warp 是否是正确的单位。我期望一些线程能够避免全局内存访问,因为数据已经被前一个线程提取到 L1 缓存中。

这些是结果:

P1:

P2:

P3:

我已经看到了一些差异:

  • 负载事务的数量从 P1 大幅增加到 P2 和 P3。
  • P2 和 P3 中发出的加载/存储指令的数量也非常高,超出了我的解释范围。我不确定我是否理解这个数字代表什么。

当我转向非缓存测试时,这些是结果

P1:

P2:

P3:

如您所见,没有任何变化。我期待看到一些差异,因为在非缓存情况下,L1 缓存被丢弃,但事务以 32 字节字的形式发生。


问题

  • 我的方法完全正确吗?
  • 共享内存可以帮助我减少传输量吗?
  • 为什么我看不到缓存和非缓存案例之间的实质性区别?
  • 为什么 P3 不比 P2 慢,就像 P2 比 P1 慢一样?
  • 还有哪些其他指标可以帮助我了解实际发生的情况?
0 投票
1 回答
545 浏览

profiling - NVPROF Power Profile 究竟测量什么?

我使用 NVPROF 获得了 Kepler Architecture NVIDIA GPU 的功率曲线。我的问题是我们到底看到了什么?如果我理解正确的话,有一个 12V 和 3.3V 的导轨为 GPU 供电,而 GPU 可以从 PCI 总线获取电力。NVPROF 功率样本是三者的总和吗?或者是其他东西?

谢谢,

0 投票
2 回答
6780 浏览

cuda - 如何观察可执行文件的一小部分的 CUDA 事件和指标(例如,仅在内核执行期间)?

我熟悉使用 nvprof 访问基准的事件和指标,例如,

命令给出开始时间、内核结束时间、电源、温度的时间戳,并将信息保存在 nvvp 文件中,以便我们可以在可视化分析器中查看它。这使我们能够看到代码的任何部分发生了什么,特别是在特定内核运行时。我的问题是——

有没有办法隔离仅在基准运行的一部分中计数的事件,例如在内核执行期间?在上面的命令中,

只是给出整个可执行文件的指令。谢谢!

0 投票
1 回答
5327 浏览

cuda - 将 CUDA nvprof 输出导出到 Visual Profiler

我想从我的 GPU 应用程序中提取数据以检查其限制。我必须使用nvprof因为应用程序在远程服务器上运行,所以我应该创建一个文件以在Visual Profiler中本地导入。我尝试使用nvprof -o file_name <app> <params>和使用创建文件,nvprof --analysis-metrics --output-profile file_name <app> <params>但是当我在 Visual Profiler 上导入这些文件时,在分析部分中的一些字段为空:“全局内存加载数据不足”、“全局内存存储数据不足”、“内核不足” SM数据”... 我如何生成一个文件(或更多文件)以获得分析部分的所有信息?我用带有标志的nvcc编译 cuda 代码-lineinfo -arch compute_20 -code sm_20 --ptxas-options=-v。以下是一些空字段的示例:在此处输入图像描述

0 投票
1 回答
92 浏览

cuda - 我在哪里可以找到最新的 Nvidia CUDA Profiler 用户指南中缺少的公式

我发现在以前版本的分析器用户指南中,提供了指标的公式。

例如,

但是在最新版本中,这个“公式”部分被“范围”所取代。有谁知道我在哪里可以找到最新探查器的这些公式。由于 nvprof 添加了更多功能和指标,我不确定是否仍然可以使用 nvprof v5.0 或更早版本提供的旧版本公式。

0 投票
1 回答
276 浏览

c++ - CUDA 并发内核启动不起作用

我正在编写一个用于图像处理的 CUDA 程序。将为 RGB 通道启动相同的内核“processOneChannel”。

下面我尝试为三个内核启动指定流,以便可以同时处理它们。但是nvprof说他们还在陆续推出……

这三个之前和之后还有另外两个内核,我不希望它们同时运行。

基本上我想要以下内容:seperateChannels --> processOneChannel(x3) --> recombineChannels

请指教我做错了什么..

这是 nvprof gpu 跟踪输出。请注意,内核启动前的 memcpy 是为了传递过滤器数据进行处理,因此它们不能与内核启动同时运行。

这是我将 -default-stream per-thread 传递给 nvcc 的 CMakeList.txt

0 投票
1 回答
1121 浏览

memory - What exactly are the transaction metrics reported by NVPROF?

I'm trying to figure out what exactly each of the metrics reported by "nvprof" are. More specifically I can't figure out which transactions are System Memory and Device Memory read and writes. I wrote a very basic code just to help figure this out.

Then I run nvprof --metrics all for the output to see all the metrics. This is the part I'm interested in:

I understand the shared and global accesses. The global accesses are coalesced and since there are 8 warps, there are 8 transactions. But I can't figure out the system memory and device memory write transaction numbers.

0 投票
2 回答
4536 浏览

c - nvprof 没有接收任何 API 调用或内核

我正在尝试使用 nvprof 在我的 CUDA 程序中获得一些基准时间,但不幸的是它似乎没有分析任何 API 调用或内核。我寻找了一个简单的初学者示例以确保我做对了,并在此处的 Nvidia 开发博客上找到了一个示例:

https://devblogs.nvidia.com/parallelforall/how-optimize-data-transfers-cuda-cc/

代码:

命令行:

所以我逐字逐句地复制它,并运行相同的命令行参数。不幸的是,我的结果是一样的:

我正在运行 Nvidia 工具包 7.5

如果有人知道我做错了什么,我会很感激知道答案。

-----编辑-----

所以我将代码修改为

不幸的是,它并没有改变事情。