问题标签 [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.
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,而是更现实的东西。
如何获得两条迹线之间的正确偏移量?
cuda - 了解 CUDA 分析器输出 (nvprof)
我只是在查看以下输出并试图围绕这些数字思考:
当谈到优化内存访问时,在比较不同的实现时我真正需要查看哪些数字?它首先看起来像memcpy
只需要117.53+107.32ms
(在两个方向上),但随后有这个 API 调用cudaMemcpy
: 41.8256s
,这要多得多。此外,上下输出块之间的 min/avg/max 列不会相加。
为什么会有差异,什么是对我优化内存传输很重要的“真实”数字?
编辑:第二个问题是:有没有办法找出谁在打电话axpy_kernel_val
(以及多少次)?
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_transactions
(m
合并访问:按 128 字节字写入)对于 P1,介于P2m
和2m
P2 之间m
以及3m
P3 之间的某个地方,因为每个 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 慢一样?
- 还有哪些其他指标可以帮助我了解实际发生的情况?
profiling - NVPROF Power Profile 究竟测量什么?
我使用 NVPROF 获得了 Kepler Architecture NVIDIA GPU 的功率曲线。我的问题是我们到底看到了什么?如果我理解正确的话,有一个 12V 和 3.3V 的导轨为 GPU 供电,而 GPU 可以从 PCI 总线获取电力。NVPROF 功率样本是三者的总和吗?或者是其他东西?
谢谢,
cuda - 如何观察可执行文件的一小部分的 CUDA 事件和指标(例如,仅在内核执行期间)?
我熟悉使用 nvprof 访问基准的事件和指标,例如,
这
命令给出开始时间、内核结束时间、电源、温度的时间戳,并将信息保存在 nvvp 文件中,以便我们可以在可视化分析器中查看它。这使我们能够看到代码的任何部分发生了什么,特别是在特定内核运行时。我的问题是——
有没有办法隔离仅在基准运行的一部分中计数的事件,例如在内核执行期间?在上面的命令中,
只是给出整个可执行文件的指令。谢谢!
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
。以下是一些空字段的示例:
cuda - 我在哪里可以找到最新的 Nvidia CUDA Profiler 用户指南中缺少的公式
我发现在以前版本的分析器用户指南中,提供了指标的公式。
例如,
但是在最新版本中,这个“公式”部分被“范围”所取代。有谁知道我在哪里可以找到最新探查器的这些公式。由于 nvprof 添加了更多功能和指标,我不确定是否仍然可以使用 nvprof v5.0 或更早版本提供的旧版本公式。
c++ - CUDA 并发内核启动不起作用
我正在编写一个用于图像处理的 CUDA 程序。将为 RGB 通道启动相同的内核“processOneChannel”。
下面我尝试为三个内核启动指定流,以便可以同时处理它们。但是nvprof说他们还在陆续推出……
这三个之前和之后还有另外两个内核,我不希望它们同时运行。
基本上我想要以下内容:seperateChannels --> processOneChannel(x3) --> recombineChannels
请指教我做错了什么..
这是 nvprof gpu 跟踪输出。请注意,内核启动前的 memcpy 是为了传递过滤器数据进行处理,因此它们不能与内核启动同时运行。
这是我将 -default-stream per-thread 传递给 nvcc 的 CMakeList.txt
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.
c - nvprof 没有接收任何 API 调用或内核
我正在尝试使用 nvprof 在我的 CUDA 程序中获得一些基准时间,但不幸的是它似乎没有分析任何 API 调用或内核。我寻找了一个简单的初学者示例以确保我做对了,并在此处的 Nvidia 开发博客上找到了一个示例:
https://devblogs.nvidia.com/parallelforall/how-optimize-data-transfers-cuda-cc/
代码:
命令行:
所以我逐字逐句地复制它,并运行相同的命令行参数。不幸的是,我的结果是一样的:
我正在运行 Nvidia 工具包 7.5
如果有人知道我做错了什么,我会很感激知道答案。
-----编辑-----
所以我将代码修改为
不幸的是,它并没有改变事情。