1. 发行说明

CUPTI 发行说明。

发行说明,包括新功能和重要错误修复。支持的平台和 GPU。

1.1. 发行说明

1.1.1. CUDA 12.8 中的更新

新功能

  • 增加了对 Blackwell 架构的支持。

  • Blackwell 架构引入了一种新的硬件方法,称为 HW 事件,用于收集 CUDA 内核时间戳。与传统的 SW instrumentation 和基于信号量的方法相比,此方法提供更准确的时间戳,并且预计会为应用程序增加最少的开销。新的 API cuptiActivityEnableHWTrace 允许通过 HW 事件收集内核时间戳。在 CUDA 12.8 中,此功能是实验性的,并且受到某些限制

    • MPS、WSL、MCDM、MIG 或 vGPU 设置不支持此功能。

    • 在 Windows 上,一次只能分析单个上下文,而 Linux 允许同时跟踪多个上下文。

    • 不支持延迟附加功能。

    这些限制预计将在未来的版本中得到解决和移除。

  • 增加了对为 CUDA 事件记录完成提供 GPU 时间戳的支持。活动记录 CUpti_ActivityCudaEvent ` 已被弃用,并已替换为新的活动记录 CUpti_ActivityCudaEvent2。新字段 deviceTimestamp 提供设备端时间戳,字段 cudaEventSyncId 提供唯一 ID,以将事件同步记录与最新的 CUDA 事件记录关联起来。

  • 活动类型 CUPTI_ACTIVITY_KIND_SYNCHRONIZATION 不为返回非零 CUDA 状态的 CUDA 同步操作提供记录。API cuptiActivityEnableAllSyncRecords 可用于启用/禁用收集返回非零 CUDA 状态的所有 CUDA 同步操作。

  • 现在支持使用 Profiler Host APIRange Profiler APIs 分析 NVLINK (nvl*)、C2C 和 PCIe 指标的性能分析。这些指标是在设备级别收集的。它们不能与在上下文级别收集的指标一起收集。

  • 在 memcpy 活动记录中添加了一个新字段 copyCount,以提供批量 memcpy 操作执行的副本数量。活动记录 CUpti_ActivityMemcpy5 已被新的活动记录 CUpti_ActivityMemcpy6 取代。

  • 对于 PM 采样,用户可以配置缓冲区追加模式,以便在缓冲区溢出时保留最新的或最旧的记录。有关更多详细信息,请参阅 CUpti_PmSampling_HardwareBuffer_AppendMode 枚举。

  • 对于统一内存性能分析,使用字段 processors 提供操作中涉及的设备的位掩码。活动记录 CUpti_ActivityUnifiedMemoryCounter2 已被弃用,并已被新的活动记录 CUpti_ActivityUnifiedMemoryCounter3 取代。

  • 为了为设备启动的图提供额外的图级别跟踪信息,引入了一个新的活动记录 CUpti_ActivityDeviceGraphTrace 和活动类型 CUPTI_ACTIVITY_KIND_DEVICE_GRAPH_TRACE。活动类型 CUPTI_ACTIVITY_KIND_DEVICE_GRAPH_TRACE 不能直接启用或禁用。当启用活动类型 CUPTI_ACTIVITY_KIND_GRAPH_TRACE 并且通过 API cuptiActivityEnableDeviceGraph() 启用设备图跟踪时,它将被启用。

  • 添加了一个新的开销类型 CUPTI_ACTIVITY_OVERHEAD_UVM_ACTIVITY_INIT,以报告初始化统一内存性能分析时产生的开销。

  • 枚举 CUpti_PcieGen 已扩展为包括 PCIe Gen 6。

已弃用和删除的功能

  • CUDA 12.8 版本中已弃用来自头文件 cupti_events.h 的 CUPTI Event API 和来自头文件 cupti_metrics.h 的 CUPTI Metric API,并将在未来的 CUDA 版本中删除。建议使用 CUPTI Range Profiling API 作为替代方案。有关更多信息,请参阅 性能分析 API 的演变 部分。

  • 来自头文件 cupti_activity.h 的 PC 采样活动 API 和源/SASS 级别指标将不再在 Blackwell 和未来的 GPU 架构上受支持。这些功能在早期版本中已弃用。

已解决的问题

  • 解决了在多 GPU 系统中,PM 采样数据被收集在与预期 GPU 不同的 GPU 上的问题。

  • 修复了对于 Ampere 及更高版本架构,图中条件节点的活动记录未生成的问题。

  • 如果设备处于 MIG 模式,则设备和 NVLINK 记录中的 uuid 字段返回 MIG UUID,该 UUID 唯一标识已订阅的 MIG 计算实例。这需要来自 12.8 工具包的匹配驱动程序。

  • 即使使用 cuptiActivityEnableRuntimeApicuptiActivityEnableDriverApi API 禁用 CUDA API 跟踪,CUPTI 也会为 CUDA API 生成外部关联记录。此问题已在 CUDA 12.8 版本中得到解决。

1.1.2. CUDA 12.6 Update 2 中的更新

新功能

  • 在 CUDA 12.6 GA 版本中,CUPTI 围绕 Perfworks host API 添加了一组新的 API,以简化使用,屏蔽用户对底层概念的了解,并轻松适应 Perfworks API 的更改。host API 在头文件 cupti_profiler_host.h 中提供。作为补充,在 CUDA 12.6 Update 2 中添加了一组新的 target API,以简化新用户的性能分析,并将调用结构与其他性能分析 API 对齐,以便更快地学习和更好地适应。target API 在头文件 cupti_range_profiler.h 中提供,并将被称为 Range Profiling API。对于范围性能分析,强烈建议用户,特别是该领域的新手,使用 CUDA 12.6 中引入的新的 host 和 target API。range_profiling 示例展示了如何使用 host 和 target 范围性能分析 API。

注意

重要的是要注意,现有的 Profiling API 可能会在未来的版本中被弃用并可能被删除,因此过渡到新的 Profiler Host APIRange Profiler APIs 将确保持续的支持和兼容性。

  • 增加了对 Microsoft Compute Driver Model (MCDM) 上的跟踪和性能分析的支持。这需要 NVIDIA 显示驱动程序版本 565 或更高版本。

已解决的问题

  • 提高了在 GPU 上捕获并转换为 CPU 时间戳的时间戳的转换精度。

  • 活动记录中报告的时间戳对于 Linux 的 Windows 子系统 (WSL) 系统并非始终正确。此问题已修复。

  • 修复了导致无法捕获 CUDA 图的条件节点主体内部内核的跟踪信息的问题。这需要 NVIDIA 显示驱动程序版本 565 或更高版本。

  • 所有 GA10x (GA102+) 芯片都支持 PM 采样触发模式 CUPTI_PM_SAMPLING_TRIGGER_MODE_GPU_TIME_INTERVAL

  • 修复了 CUDA 12.2 或更早版本随附的驱动程序版本的几个 CUPTI 活动的增强兼容性(又名次要版本兼容性)问题。

  • 为每个线程的活动缓冲区功能使活动缓冲区的刷新成为线程安全的。

1.1.3. CUDA 12.6 Update 1 中的更新

已解决的问题

  • 使用 cuptiEnableDomain API 禁用域中的所有回调可能会意外禁用其他活动和回调。此问题已得到解决。

  • 修复了 CUDA 12.2 或更早版本随附的驱动程序版本的几个 CUPTI 活动的增强兼容性(又名次要版本兼容性)问题。

1.1.4. CUDA 12.6 中的更新

新功能

  • CUPTI 引入了 PM 采样 API,用于通过以固定时间间隔定期采样 GPU 的性能监视器 (PM) 来收集 CUDA 工作负载的许多硬件指标。这些 API 在头文件 cupti_pmsampling.h 中提供。Turing 及更高版本的 GPU 架构,即计算能力为 7.5 及更高的设备支持这些 API。有关更多详细信息,请参阅 PM 采样 API 部分。

  • 性能分析分为四个主要阶段 - 枚举、配置、收集和评估。枚举、配置和评估这三个阶段的 API 由底层 Perfworks API 直接提供。CUPTI 正在围绕这些 Perfworks host API 添加一组新的 API,以简化使用,屏蔽用户对底层概念的了解,并轻松适应 Perfworks API 的更改。这些 API 提高了一致性,减少了混淆,并增强了与 CUPTI API 的集成。新的 host API 在头文件 cupti_profiler_host.h 中提供。此外,将在未来的版本中引入新的 target API,以简化新用户的性能分析,并将调用结构与其他性能分析 API 对齐,以便更快地学习和更好地适应。

  • 增加了对识别内存分配来源的支持。当从应用程序调用的库或共享对象发出内存分配请求时,这非常有用。在内存活动记录中添加了一个新字段 source。活动记录 CUpti_ActivityMemory3 已被弃用,并被新的活动记录 CUpti_ActivityMemory4 取代。有关更多详细信息,请参阅 设备内存分配源跟踪 部分。

  • 添加了一个新的开销类型 CUPTI_ACTIVITY_OVERHEAD_ACTIVITY_BUFFER_REQUEST,以报告从 CUPTI 客户端请求活动缓冲区时产生的开销。

  • 为 ARM 服务器 (arm64 SBSA) 添加了静态库 libcupti_static.a

已弃用和删除的功能

  • 来自头文件 cupti_activity.h 的源/SASS 级别指标在 Volta 及更高版本的 GPU 架构上已被弃用,并且将在未来的版本中删除。它包括指标 CUPTI_ACTIVITY_KIND_GLOBAL_ACCESSCUPTI_ACTIVITY_KIND_SHARED_ACCESSCUPTI_ACTIVITY_KIND_BRANCHCUPTI_ACTIVITY_KIND_INSTRUCTION_EXECUTION 以及相关的关联类型 CUPTI_ACTIVITY_KIND_SOURCE_LOCATORCUPTI_ACTIVITY_KIND_INSTRUCTION_CORRELATION。建议迁移到来自头文件 cupti_sass_metrics.hSASS Metric API,该 API 在 Volta 及更高版本的 GPU 架构上受支持。

已解决的问题

  • 导出了性能分析 API cuptiProfilerIsPassCollected

  • 降低了 memcpy 跟踪的收集开销。

  • 对于某些活动,活动缓冲区请求的持续时间被包含在活动持续时间中。此问题已解决。

1.1.5. CUDA 12.5 Update 1 中的更新

已解决的问题

  • 修复了 CUDA 图的图级别跟踪的崩溃问题。

  • 修复了由于未启用其他活动而可能未发出资源回调 CUPTI_CBID_RESOURCE_MODULE_PROFILED 的问题。此问题是在 CUDA 12.4 Update 1 版本中引入的。

1.1.6. CUDA 12.5 中的更新

新功能

  • 添加了 API cuptiActivityEnableDriverApicuptiActivityEnableRuntimeApi,以限制对感兴趣的 CUDA API 的跟踪。这有助于减少 CUDA API 跟踪开销。

  • 添加了新字段 cigMode,以传达与 CUDA 上下文关联的 CUDA in Graphics (CIG) 模式。活动记录 CUpti_ActivityContext2 已被弃用,并被新的活动记录 CUpti_ActivityContext3 取代。枚举 CUpti_ContextCigMode 描述了支持的 CIG 模式。

  • 在上下文活动记录中添加了新字段 numMultiprocessors,以传达分配给绿色上下文的多处理器数量。

  • Tegra 平台上的 MPS(多进程服务)支持跟踪。

  • 为 Linux x86_64 平台提供了混淆符号,这有助于我们加快解决崩溃、挂起等问题的调试过程。请参阅 https://developer.nvidia.com/blog/cuda-toolkit-symbol-server/,了解如何使用混淆符号。符号服务器地址为:https://cudatoolkit-symbols.nvidia.com/

已弃用和删除的功能

  • 来自头文件 cupti_activity.h 的 PC 采样活动 API 在 Volta 及更高版本的 GPU 架构上已被弃用,并且将在未来的版本中删除。建议迁移到来自头文件 cupti_pcsampling.hPC 采样 API,该 API 在 Volta 及更高版本的 GPU 架构上受支持。

  • 删除了对 PowerPC (ppc64le) 架构的支持。

已解决的问题

  • 修复了异构内存管理 (HMM) 和地址转换服务 (ATS) 系统上的统一内存性能分析问题。

1.1.7. CUDA 12.4 Update 1 中的更新

已解决的问题

  • 修复了将 API cuptiFinalize 用于使用 CUDA 图的应用程序时发生的崩溃问题。

  • 修复了在使用图级别跟踪时,跟踪图中的 memcpy 和 memset 节点时可能发生的崩溃问题。

  • 如果工作线程缓冲区未满,则跳过在内部刷新时传递工作线程缓冲区。

1.1.8. CUDA 12.4 中的更新

新功能

  • 增加了对使用绿色上下文的应用程序的跟踪支持。在上下文活动记录中添加了两个新字段 isGreenContextparentContextId。活动记录 CUpti_ActivityContext 已被弃用,并被新的活动记录 CUpti_ActivityContext2 取代。

  • 从主机 CPU 的角度来看,CUDA API 调用是异步完成的。这是通过将计划用于 GPU 的工作排队到称为命令缓冲区的结构中来完成的。如果在尝试调用 CUDA API 时命令缓冲区中可用空间不足,则主机调用将阻塞,直到空间可用为止。用户应该能够识别何时发生这种情况。这使用活动开销枚举 CUpti_ActivityOverheadKind 中添加的新属性 CUPTI_ACTIVITY_OVERHEAD_COMMAND_BUFFER_FULL 来指示。为了提供有关开销的更多详细信息,在开销活动记录中添加了一个新字段 overheadData。活动记录 CUpti_ActivityOverhead2 已被弃用,并被新的活动记录 CUpti_ActivityOverhead3 取代。

  • 在 JIT 活动记录中添加了进程 ID 和线程 ID。为了适应此更改,活动记录 CUpti_ActivityJit 已被弃用,并被新的活动记录 CUpti_ActivityJit2 取代。

  • 为了将内核的采样数据与 PC 采样 API 串行模式下的启动 API 相关联,在结构 CUpti_PCSamplingPCData 中添加了一个新字段 correlationId

  • 对于 PC 采样 API,默认情况下会收集总计 (smsp__pcsamp_sample_count) 和丢弃 (smsp__pcsamp_samples_data_dropped) 样本计数。

已解决的问题

  • 修复了开销记录显示默认线程 ID 而不是使用 API cuptiSetThreadIdType() 请求的线程 ID 的问题。

  • 修复了 CUDA 图应用程序的指令级别 SASS 指标性能分析。

  • 当设备图首次从设备启动并且之前未从主机启动时,对于 Ampere 及更高版本的 GPU 架构上的图级别跟踪,结束时间戳可能为 0。此问题已修复。

1.1.9. CUDA 12.3 Update 1 中的更新

已解决的问题

  • 为了为所有活动提供标准化的时间戳,CUPTI 使用线性插值将 GPU 时间戳转换为 CPU 时间戳。这在 CUDA 12.3 中被破坏,导致 Tegra 平台上出现虚假的间隙或重叠。修复了此问题。

1.1.10. CUDA 12.3 中的更新

新功能

  • 在活动开销枚举 CUpti_ActivityOverheadKind 中添加了新属性 CUPTI_ACTIVITY_OVERHEAD_RUNTIME_TRIGGERED_MODULE_LOADINGCUPTI_ACTIVITY_OVERHEAD_LAZY_FUNCTION_LOADING,以分别提供 CUDA 运行时触发的模块加载和延迟函数加载的开销信息。

  • 新的 API cuptiGetGraphExecId 提供了可执行图的唯一 ID。

  • 增加了对收集设备启动图的图级别跟踪的支持。添加了一个新的 API cuptiActivityEnableDeviceGraph,以启用收集设备启动图的记录。

  • CUDA 图可以在多个设备上执行,即根节点可以在一个设备上启动,而叶节点可以在另一个设备上启动。添加了新字段 endDeviceIdendContextId,以分别标识用于执行图的最后一个节点的设备和上下文的 ID。为了适应此更改,活动记录 CUpti_ActivityGraphTrace 已被弃用,并被新的活动记录 CUpti_ActivityGraphTrace2 取代。

  • 在 Windows 10 WSL(OS 构建版本 19044 及更高版本)上增加了 WSL 性能分析支持。对于系统内存超过 1 TB 的系统,Windows 10 WSL 不支持 WSL 性能分析。

  • 在跟踪路径中完成了几项性能改进。其中一项关键改进是允许客户端请求 CUPTI 在线程级别而不是全局缓冲区级别维护活动缓冲区。这可以通过设置枚举 CUpti_ActivityAttribute 的选项 CUPTI_ACTIVITY_ATTR_PER_THREAD_ACTIVITY_BUFFER 来实现。这有助于减少从多个主机线程启动 CUDA 活动的应用程序的收集开销。

  • 为 Linux x86_64 库启用了帧指针。

  • 已弃用的 Activity API 和结构已移至新的头文件 cupti_activity_deprecated.h,该文件包含在头文件 cupti_activity.h 中。头文件 cupti_activity.h 仅包含最新版本的 API 和结构。

  • CUPTI 不再使用性能分析信号量池来存储性能分析数据。相应的属性 CUPTI_ACTIVITY_ATTR_PROFILING_SEMAPHORE_POOL_SIZECUPTI_ACTIVITY_ATTR_PROFILING_SEMAPHORE_POOL_LIMITCUPTI_ACTIVITY_ATTR_PROFILING_SEMAPHORE_PRE_ALLOCATE_VALUE 已被弃用。

已解决的问题

  • 修复了 cuda 图的 SASS 指标性能分析。

  • 修复了 API cuptiSetThreadIdType 对于延迟订阅的竞争条件。

1.1.11. CUDA 12.2 Update 2 中的更新

新功能

  • CUDA 12.2 GA 版本中引入的 SASS Metric API 正在从 Beta 过渡到生产版本。

    • 增加了对收集从主机启动的 CUDA 图的 SASS 指标的支持。

    • 在结构 CUpti_SassMetricsDisable_Params 中添加了一个新字段 numOfDroppedRecords,以指示在调用禁用 API 之前刷新 SASS 数据时丢弃的记录数。

  • 在结构 CUpti_Profiler_DeviceSupported_Params 中添加了一个新字段 api,该字段可用于检查性能分析 API(如 Profiling、PC Sampling 和 SASS Metric API)的配置支持级别。

已解决的问题

  • 修复了 GA103 GPU 的跟踪和性能分析支持。

  • 修复了在使用 PC 采样活动 API 收集采样数据时活动缓冲区已满时可能发生的挂起问题。

  • 修复了使用 API cuGraphNodeSetEnabledcudaGraphNodeSetEnabled 禁用图节点时,图级别跟踪的时间戳不正确的问题。

1.1.12. CUDA 12.2 Update 1 中的更新

对机密计算的支持

CUPTI 在 CC-devtools 模式下运行时支持某些 API

  • Callback API

  • Activity API

此版本在 CC-devtools 模式下不支持性能分析 API。使用这些 API 应返回错误,指示不支持此配置

  • Profiling API

  • PC Sampling API

  • Checkpoint API

  • SASS Metrics API

此外,在完整的 CC 模式下,完全不支持 CUPTI。CC-devtools 模式必须用于工具支持。某些 CUDA API 在 CC 或 CC-devtools 模式下运行时不受支持或行为有所不同;值得注意的是,主机固定内存请求将被跟踪为托管内存请求,并且无论源指针或目标指针的局部性如何,在这些转换后的指针上的任何 CUDA 内存复制都将被跟踪为设备到设备复制。有关如何配置 CC 或 CC-devtools 模式、系统和软件要求以及 CUDA API 更改文档的详细信息,请参阅机密计算版本文档,网址为 https://docs.nvda.net.cn/confidential-computing/

已解决的问题

  • 修复了跨多个 GPU 运行的 CUDA 图的图级别跟踪的时间戳。

  • 修复了当 CUPTI 无法获取活动的属性时可能发生的挂起问题。

1.1.13. CUDA 12.2 中的更新

新功能

  • 在头文件 cupti_sass_metrics.h 中提供了一组新的 CUPTI API,用于收集源代码级别的 SASS 指标数据。 与用于源代码分析的 CUPTI Activity API 相比,这些 API 支持更多指标。 SASS 到源代码的关联可以在离线模式下完成,类似于 PC 采样 API。 因此,数据收集期间的运行时开销较低。 有关更多详细信息,请参阅 CUPTI SASS 指标 API 部分。 请注意,这是一个 Beta 功能,界面和功能在未来的版本中可能会发生变化。

  • CUPTI 现在通过回调即时报告致命错误、非致命错误和警告。 添加了一个新的回调域 CUPTI_CB_DOMAIN_STATE 用于订阅即时错误报告。 结构体 CUpti_CallbackIdState 中提供了相应的回调 ID。

  • 增加了对设备图和启动设备图的主机图进行分析的支持。 存在一些已知限制,详情请参阅“已知问题”部分。

  • 流属性值的更改通过发出资源回调来传达。 请参阅结构体 CUpti_StreamAttrData 和枚举 CUpti_CallbackIdResource 中添加的回调 ID CUPTI_CBID_RESOURCE_STREAM_ATTRIBUTE_CHANGED

  • 新的 API cuptiGetErrorMessage 为 CUPTI 错误代码提供描述性消息。

  • 从头文件 cupti_events.h 中移除了已弃用的 API cuptiDeviceGetTimestamp

  • 添加了用于张量核操作的指标,以计算不同类型的张量指令。 这些指标被命名为 sm[sp]__ops_path_tensor_src_{src}[_dst_{dst}[_sparsity_{on,off}]]. 这些指标适用于计算能力为 7.0 及更高版本的设备,但 Turing TU11x GPU 除外。

已解决的问题

  • 修复了从主机启动的设备图的图级跟踪的崩溃问题。

1.1.14. CUDA 12.1 Update 1 中的更新

已解决的问题

  • 修复了当使用环境变量 CUDA_DISABLE_PTX_JIT 禁用嵌入式 PTX 代码的即时编译时,CUPTI 跟踪失败的问题。

  • 修复了 API cuptiFinalize 中的崩溃问题。

1.1.15. CUDA 12.1 中的更新

新功能

  • 在结构体 CUpti_Profiler_DeviceSupported_Params 中添加了字段 wsl,以指示 Profiling API 是否在 Windows Subsystem for Linux (WSL) 系统上受支持。

1.1.16. CUDA 12.0 Update 1 中的更新

已解决的问题

  • 通过避免在加载 CUDA 模块时缓存 cubin 镜像副本,减少了主机内存开销。 现在仅当启用需要它的分析功能时,才会创建 cubin 镜像副本。

  • 默认情况下,CUPTI 切换回设备内存,而不是绑定的主机内存,以分配用于并发内核跟踪的分析缓冲区。 这可能有助于提高跟踪运行的性能。 内存位置可以使用活动属性枚举 CUpti_ActivityAttribute 的属性 CUPTI_ACTIVITY_ATTR_MEM_ALLOCATION_TYPE_HOST_PINNED 来控制。

  • 当使用 API cudaGraphInstantiate 实例化图后但在使用 API cudaGraphLaunch 启动图之前连接 CUPTI 时,CUPTI 现在可以捕获 cudaGraphLaunch API 及其内核。 内核记录中的某些数据将丢失,例如 cacheConfigsharedMemoryExecutedpartitionedGlobalCacheRequestedpartitionedGlobalCacheExecutedsharedMemoryCarveoutRequested 等。 此修复需要与 CUDA 12.0 Update 1 版本一起提供的匹配 CUDA 驱动程序。

1.1.17. CUDA 12.0 中的更新

新功能

  • 添加了新字段 maxPotentialClusterSizemaxActiveClusters,以帮助正确计算集群占用率。 这些字段对于计算能力为 9.0 及更高版本的设备有效。 为了适应此更改,活动记录 CUpti_ActivityKernel8 已弃用,并由新的活动记录 CUpti_ActivityKernel9 替换。

  • PC 采样 API 的增强功能

    • CUPTI 创建了一些工作线程,以卸载某些操作,例如将硬件数据解码为 CUPTI PC 采样数据,以及将 PC 数据与 SASS 指令相关联。 CUPTI 定期唤醒这些线程。 为了控制工作线程的睡眠时间,在枚举 CUpti_PCSamplingConfigurationAttributeType 中添加了一个新的属性 CUPTI_PC_SAMPLING_CONFIGURATION_ATTR_TYPE_WORKER_THREAD_PERIODIC_SLEEP_SPAN

    • 改进了硬件缓冲区溢出的错误报告。 当硬件缓冲区溢出时,CUPTI 返回内存不足错误代码。 并且在结构体 CUpti_PCSamplingData 中添加了一个新字段 hardwareBufferFull,用于将其与其他内存不足情况区分开来。 用户可以增加硬件缓冲区大小或以更高的频率刷新硬件缓冲区以避免溢出。

  • Profiling API 在 Windows Subsystem for Linux (WSL) 上受支持,WSL 版本为 2,NVIDIA 显示驱动程序版本为 525 或更高版本,以及 Windows 11。

  • CUPTI 在 CUDA Toolkit 12.0 中放弃了对 Kepler GPU 的支持。

已解决的问题

  • 出于兼容性原因,从 CUPTI 共享库的 SONAME 中移除了次要 CUDA 版本。 例如,在 CUDA 12.0 版本中,CUPTI 库的 SONAME 是 libcupti.so.12 而不是 libcupti.so.12.0。

  • 活动类型 CUPTI_ACTIVITY_KIND_MARKERCUPTI_ACTIVITY_KIND_MARKER_DATA 可以一起启用。

1.1.18. 旧版本

1.1.18.1. CUDA 11.8 中的更新

新功能

  • CUPTI 增加了对 Hopper 和 Ada Lovelace GPU 系列的跟踪和分析支持。

  • 添加了新字段 clusterXclusterYclusterZclusterSchedulingPolicy,以输出线程块集群的维度和调度策略。 这些字段对于计算能力为 9.0 及更高版本的设备有效。 为了适应此更改,活动记录 CUpti_ActivityKernel7 已弃用,并由新的活动记录 CUpti_ActivityKernel8 替换。

  • 引入了一个新的活动类型 CUPTI_ACTIVITY_KIND_JIT 和相应的活动记录 CUpti_ActivityJit,以捕获 JIT(即时)编译和缓存 PTX 或 NVVM IR 代码到二进制代码中涉及的开销。 新记录还提供了有关存储二进制代码的计算缓存的大小和路径的信息。

  • PC 采样 API 在 Tegra 平台(QNX、Linux (aarch64) 和 Linux (x86_64) (Drive SDK))上受支持。

已解决的问题

  • 解决了一个问题,该问题可能在创建 CUDA 上下文后,使用属性 CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_SIZE 更改设备缓冲区大小时导致崩溃。

1.1.18.2. CUDA 11.7 Update 1 中的更新

已解决的问题

  • 解决了一个关于 PC 采样 API cuptiPCSamplingGetData 的问题,该问题可能不会始终返回在使用 API cuptiPCSamplingStartcuptiPCSamplingStop 定义的 PC 采样范围之后调用的所有样本。 剩余样本在下一个范围之后 API cuptiPCSamplingGetData 的后续调用中传递。

  • 当用户使用活动类型 CUPTI_ACTIVITY_KIND_GRAPH_TRACE 在图级别启用跟踪时,禁用了 CUDA 图中节点的跟踪。

  • 修复了内核记录中缺少 channelIDchannelType 信息的问题。 以前,这些字段仅为 CUDA 图启动填充。

1.1.18.3. CUDA 11.7 中的更新

新功能

  • 引入了一个新的活动类型 CUPTI_ACTIVITY_KIND_GRAPH_TRACE 和活动记录 CUpti_ActivityGraphTrace,以表示图的执行,而不显示其节点的执行情况。 这旨在减少单独跟踪每个节点所涉及的开销。 此活动只能为 515 及更高版本的驱动程序启用。

  • 添加了一个新的 API cuptiActivityEnableAndDump,用于在分析会话期间的任何时间点提供某些活动(如设备、上下文、流、NVLink 和 PCIe)的快照。

  • 添加了示例 cupti_correlation,以显示 CUDA API 和相应的 GPU 活动之间的关联。

  • 添加了示例 cupti_trace_injection,以显示如何使用活动和回调 API 构建注入库,该库可用于跟踪任何 CUDA 应用程序。

已解决的问题

  • 修复了 PC 采样 API 记录中函数名称的损坏问题。

  • 修复了当用户在后期 CUPTI 连接场景中调用 API cuptiActivityRegisterTimestampCallback 时,GPU 活动的时间戳不正确的问题。

  • 修复了后期 CUPTI 连接场景中设备到设备内存复制的不完整记录问题。 当应用程序混合使用 CUDA 图和普通内核启动时,此问题主要表现出来。

1.1.18.4. CUDA 11.6 Update 1 中的更新

已解决的问题

  • 修复了 PC 采样 API cuptiPCSamplingStop 的挂起问题。 当 PC 采样启动和停止导致生成大量采样记录时,会看到此问题。

  • 修复了特定设备到设备内存复制操作的计时问题。

1.1.18.5. CUDA 11.6 中的更新

新功能

  • 在内核、内存复制、点对点内存复制和 memset 的活动记录中添加了两个新字段 channelIDchannelType,以输出这些活动发生的硬件通道的 ID 和类型。 活动记录 CUpti_ActivityKernel6CUpti_ActivityMemcpy4CUpti_ActivityMemcpyPtoP3CUpti_ActivityMemset3 已弃用,并由新的活动记录 CUpti_ActivityKernel7CUpti_ActivityMemcpy5CUpti_ActivityMemcpyPtoP4CUpti_ActivityMemset4 替换。

  • 在设备活动记录中添加了新字段 isMigEnabledgpuInstanceIdcomputeInstanceIdmigUuid,以提供启用 MIG 的 GPU 的 MIG 信息。 活动记录 CUpti_ActivityDevice3 已弃用,并由新的活动记录 CUpti_ActivityDevice4 替换。

  • 在内存池和内存活动记录中添加了一个新字段 utilizedSize,以提供内存池的已用大小。 活动记录 CUpti_ActivityMemoryPoolCUpti_ActivityMemory2 已弃用,并分别由新的活动记录 CUpti_ActivityMemoryPool2CUpti_ActivityMemory3 替换。

  • 添加了 API cuptiActivityRegisterTimestampCallback 和回调函数 CUpti_TimestampCallbackFunc,用于注册回调函数以获取用户选择的时间戳,而不是在活动记录中使用 CUPTI 提供的时间戳。

  • Profiling API 支持分析 OptiX 应用程序。

已解决的问题

  • 修复了在 Cuda Graph 的自动范围和内核重放模式下使用 Profiling API 进行多通道指标收集的问题。

  • 修复了 PC 采样 API cuptiPCSamplingStop 的性能问题。

  • 修复了 OpenACC 活动记录中变量名称的损坏问题。

  • 修复了活动记录 CUpti_ActivityMemory3 中结构体 memoryPoolConfig 字段中的损坏问题。

  • 当使用 cudaFree CUDA API 释放通过内存池分配的内存指针时,填充了活动记录 CUpti_ActivityMemory3 中结构体 memoryPoolConfig 的字段。

1.1.18.6. CUDA 11.5 Update 1 中的更新

已解决的问题

  • 解决了一个导致 NVTX 事件属性的范围名称不正确的问题。 该问题是在 CUDA 11.4 中引入的。

  • 使 NVTX 初始化 API InitializeInjectionNvtxInitializeInjectionNvtx2 线程安全。

1.1.18.7. CUDA 11.5 中的更新

新功能

  • 引入了一个新的 API cuptiProfilerDeviceSupported,以公开给定设备的整体 Profiling API 支持和特定要求。 Profiling API 必须通过调用 cuptiProfilerInitialize 进行初始化,然后再测试设备支持。

  • PC 采样结构体 CUpti_PCSamplingData 引入了一个新字段 nonUsrKernelsTotalSamples,以提供有关为所有非用户内核收集的样本数量的信息。

  • 用于设备信息的活动记录 CUpti_ActivityDevice2 已弃用,并由新的活动记录 CUpti_ActivityDevice3 替换。 新记录添加了一个标志 isCudaVisible,以指示设备是否对 CUDA 可见。

  • 用于 NVLink 信息的活动记录 CUpti_ActivityNvLink3 已弃用,并由新的活动记录 CUpti_ActivityNvLink4 替换。 新记录最多可容纳 32 个 NVLink 端口信息。

  • 引入了一个新的 CUPTI Checkpoint API,支持自动保存和恢复设备状态,并促进内核重放工具的开发。 这对于 CUPTI Profiling API 的用户重放模式很有帮助,但不限于与 CUPTI 一起使用。

  • 在 Windows Subsystem for Linux version 2 (WSL 2) 上支持跟踪。

  • CUPTI 在 NVIDIA Crypto Mining Processors (CMP) 上不受支持。 引入了一个新的错误代码 CUPTI_ERROR_CMP_DEVICE_NOT_SUPPORTED 来指示这一点。

已解决的问题

  • 解决了一个导致设备到设备内存复制操作跟踪崩溃的问题。

  • 解决了一个在其他活动之前启用 OpenACC 活动时导致崩溃的问题。

1.1.18.8. CUDA 11.4 Update 1 中的更新

已解决的问题

  • 解决了对使用多线程启动工作的应用程序的 CUDA 图启动进行序列化的问题。

  • 以前,对于使用 CUDA Dynamic Parallelism (CDP) 的应用程序,CUPTI 会检测 CUDA 模块中是否存在 CDP 内核。 即使未调用 CDP 内核,它也会无法跟踪应用程序。 行为发生了一些变化,CUPTI 现在会跟踪所有主机启动的内核,直到它遇到启动子内核的主机启动内核。 后续内核将不会被跟踪。

1.1.18.9. CUDA 11.4 中的更新

新功能

  • Profiling API 支持分析由 CUDA 图启动的 CUDA 内核节点。 支持内核重放模式的自动范围分析和用户重放和应用程序重放模式的用户范围分析。 不支持范围分析和重放模式的其他组合。

  • 增加了对在即将发布的 GRID/vGPU 版本上对 NVIDIA 虚拟 GPU (vGPU) 进行跟踪和分析的支持。

  • 添加了示例 profiling_injection,以显示如何使用 Profiling API 构建注入库。

  • 添加了示例 concurrent_profiling,以显示如何使用 Profiling API 跨流和设备保留内核并发性。

已解决的问题

  • 解决了不跟踪 CUDA 图中设备到设备内存复制节点的问题。

  • 修复了报告内存池创建记录的本地内存池大小为零的问题。

  • 解决了 PC 采样 API 的默认 CUDA 上下文不收集样本的问题。

  • 无论是否启用 NVTX 活动类型或回调,都启用了 NVTX 中所有域和注册字符串的跟踪。 此状态跟踪对于在启用 NVTX 活动类型或回调之前创建这些 NVTX 对象的工具的正常工作是必需的。

1.1.18.10. CUDA 11.3 中的更新

新功能

  • 在头文件 cupti_pcsampling.h 中提供了一组新的 CUPTI API,用于 PC 采样数据收集,这些 API 支持无需序列化内核执行的连续模式数据收集,并且运行时开销更低。 与此同时,在头文件 cupti_pcsampling_util.h 中提供了一个实用程序库,其中包含用于 GPU 汇编到 CUDA-C 源代码关联以及从文件读取和写入 PC 采样数据的 API。 有关更多详细信息,请参阅 CUPTI PC 采样 API 部分。

  • 枚举 CUpti_PcieGen 已扩展为包含 PCIe Gen 5。

  • 以下函数已弃用,将在未来的版本中删除

    • 结构体 NVPA_MetricsContext 和相关的 API NVPW_MetricsContext_* 来自头文件 nvperf_host.h。 建议改用结构体 NVPW_MetricsEvaluator 和相关的 API NVPW_MetricsEvaluator_*。 Profiling API 示例已更新,以显示如何使用这些 API。

    • cuptiDeviceGetTimestamp 来自头文件 cupti_events.h

已解决的问题

  • 减少了 CUDA 内存复制跟踪的开销。

  • 为了为所有活动提供标准化的时间戳,CUPTI 使用线性插值将 GPU 时间戳转换为 CPU 时间戳。 此方法可能会在时间轴上造成虚假的间隙或重叠。 CUPTI 改进了转换功能,以提供更精确的时间戳。

  • 为信号量池分配生成开销活动记录。

1.1.18.11. CUDA 11.2 中的更新

新功能

  • 引入了一个新的活动类型 CUPTI_ACTIVITY_KIND_MEMORY_POOL 和活动记录 CUpti_ActivityMemoryPool,以表示内存池的创建、销毁和修剪。 枚举 CUpti_ActivityMemoryPoolType 列出了内存池的类型。

  • 引入了一个新的活动类型 CUPTI_ACTIVITY_KIND_MEMORY2 和活动记录 CUpti_ActivityMemory2,以提供内存分配和释放操作的单独记录。 这有助于将这些操作的记录与相应的 CUDA API 相关联,否则使用现有的活动记录 CUpti_ActivityMemory 是不可能的,后者为内存操作提供单个记录。

  • 在内核活动记录中添加了一个新的 CUaccessPolicyWindow 类型的指针字段,以提供访问策略窗口,该窗口指定全局内存的连续区域以及 L2 缓存中对该区域内访问的持久性属性。 为了适应此更改,活动记录 CUpti_ActivityKernel5 已弃用,并由新的活动记录 CUpti_ActivityKernel6 替换。 默认情况下不收集此属性。 为了控制启动属性的收集,引入了一个新的 API cuptiActivityEnableLaunchAttributes

  • 在活动属性枚举 CUpti_ActivityAttribute 中添加了新属性 CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_PRE_ALLOCATE_VALUECUPTI_ACTIVITY_ATTR_PROFILING_SEMAPHORE_PRE_ALLOCATE_VALUE,以设置和获取为上下文预分配的设备缓冲区和分析信号量池的数量。

  • CUPTI 现在在绑定的主机内存中而不是设备内存中为并发内核跟踪分配分析缓冲区。 这可能有助于提高跟踪运行的性能。 内存位置可以使用活动属性枚举 CUpti_ActivityAttribute 的属性 CUPTI_ACTIVITY_ATTR_MEM_ALLOCATION_TYPE_HOST_PINNED 来控制。

  • 由于编译器改进了内联函数的生成行信息,CUPTI 可以将内联函数与已内联的函数调用站点的行信息相关联。

  • 由于数据收集期间可能发生的应用程序挂起,因此从 Profiling API 中移除了对 NVLink 性能指标(nvlrx__*nvltx__*)的支持。 这些指标将在未来的 CUDA 版本中重新添加。

已解决的问题

  • 减少了 CUPTI 在跟踪路径中引入的执行开销。

  • 对于并发内核活动类型 CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL,CUPTI 检测内核代码以收集计时信息。 以前,CUDA 模块中的每个内核都经过检测,因此开销与模块中不同内核的数量成正比。 这是在加载 CUDA 模块时发生的静态开销。 为了减少此开销,内核在模块加载时不会被检测,而是在加载 CUDA 模块时生成单个检测代码,并在内核执行期间将其应用于每个内核,从而避免了 CUDA 模块加载时的大部分静态开销。

1.1.18.12. CUDA 11.1 中的更新

新功能

  • CUPTI 增加了对计算能力为 8.6 的 NVIDIA Ampere GPU 的跟踪和分析支持。

  • 在内核、内存复制、点对点内存复制和 memset 的活动记录中添加了一个新字段 graphId,以输出通过 CUDA 图 API 启动活动的 CUDA 图的唯一 ID。 为了适应此更改,活动记录 CUpti_ActivityMemcpy3CUpti_ActivityMemcpyPtoP2CUpti_ActivityMemset2 已弃用,并由新的活动记录 CUpti_ActivityMemcpy4CUpti_ActivityMemcpyPtoP3CUpti_ActivityMemset3 替换。 内核活动记录 CUpti_ActivityKernel5 将填充字段替换为 graphId。 添加了一个新的 API cuptiGetGraphId,用于查询 CUDA 图的唯一 ID。

  • 添加了一个新的 API cuptiActivityFlushPeriod,用于设置工作线程的刷新周期。

  • 增加了使用 Profiling API 分析协同内核的支持。

  • 使用 Profiling API 添加了 NVLink 性能指标(nvlrx__* 和 nvltx__*)。 这些指标在计算能力为 7.0、7.5 和 8.0 的设备上可用,并且可以在上下文级别收集。 有关早期 CUPTI 指标与计算能力为 7.0 的设备的 Perfworks NVLink 指标之间的映射,请参阅表 指标映射表

已解决的问题

  • 解决了一个导致 CUPTI 长时间不返回完整且已完成的活动缓冲区的问题,CUPTI 现在尝试尽早返回缓冲区。

  • 为了减少运行时开销,CUPTI 基于某些启发式方法唤醒工作线程,而不是定期唤醒它。 新的 API cuptiActivityFlushPeriod 可用于控制工作线程的刷新周期。 此设置将覆盖 CUPTI 启发式方法。

1.1.18.13. CUDA 11.0 中的更新

新功能

  • CUPTI 增加了对计算能力为 8.0 的设备(即 NVIDIA A100 GPU 和基于 A100 的系统)的跟踪和分析支持。

  • CUDA 图的增强功能

    • 支持将 CUDA 图节点与 GPU 活动(内核、内存复制、memset)相关联。

      • 在内核、内存复制、memset 和 P2P 传输的活动记录中添加了一个新的字段 graphNodeId,用于节点 ID。 活动记录 CUpti_ActivityKernel4CUpti_ActivityMemcpy2CUpti_ActivityMemsetCUpti_ActivityMemcpyPtoP 已弃用,并由新的活动记录 CUpti_ActivityKernel5CUpti_ActivityMemcpy3CUpti_ActivityMemset2CUpti_ActivityMemcpyPtoP2 替换。

      • graphNodeId 是图节点的唯一 ID。

      • 可以使用新的 CUPTI API cuptiGetGraphNodeId() 查询 graphNodeId

      • 在 API 进入和退出回调对之间发出回调 CUPTI_CBID_RESOURCE_GRAPHNODE_CREATED

    • 引入了新的回调 CUPTI_CBID_RESOURCE_GRAPHNODE_CLONED,以指示 CUDA 图节点的克隆。

    • 在 memset 节点夹在内核节点之间的情况下,保留 CUDA 驱动程序性能优化。 对于 CUDA 图,CUPTI 不再禁用将 memset 节点转换为内核节点。

    • 增加了对 CUDA 图中协同内核的支持。

  • 增加了跟踪 Optix 应用程序的支持。 请参阅 Optix Profiling 部分。

  • CUPTI 开销与线程而不是进程相关联。 开销记录 CUpti_ActivityOverhead 的对象类型已切换为 CUPTI_ACTIVITY_OBJECT_THREAD

  • 添加了错误代码 CUPTI_ERROR_MULTIPLE_SUBSCRIBERS_NOT_SUPPORTED,以指示存在另一个 CUPTI 订阅者。API cuptiSubscribe() 返回新的错误代码,而不是 CUPTI_ERROR_MAX_LIMIT_REACHED

  • 添加了一个新的枚举 CUpti_FuncShmemLimitConfig,以指示用户是否选择在计算能力为 7.x 的设备上使用函数属性 CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTEScudaFuncAttributeMaxDynamicSharedMemorySize (分别用于 CUDA 驱动程序和运行时)来获得最大动态共享内存大小。CUpti_ActivityKernel5 内核活动记录中的字段 shmemLimitConfig 显示了用户的选择。这有助于正确的占用率计算。枚举 cudaOccFuncShmemConfig 中的值 FUNC_SHMEM_LIMIT_OPTIN 是 CUDA 占用率计算器中的相应选项。

已解决的问题

  • 解决了一个导致 memcopy 和串行内核活动的时间不正确或过时的问题。

  • 通过避免在连续内核之间 PC 采样周期不变时重新配置 GPU,降低了 PC 采样活动 API 的开销。这适用于计算能力为 7.0 及更高版本的设备。

  • 修复了 API cuptiFinalize() 中的问题,包括可能导致应用程序崩溃的问题。此 API 提供了在应用程序执行期间安全且完全分离 CUPTI 的能力。更多详细信息请参见 动态分离 部分。

1.1.18.14. CUDA 10.2 中的更新

新功能

  • CUPTI 允许桌面平台上的非 root 和非管理员用户使用跟踪功能。请注意,事件和指标分析仍然限制为非 root 和非管理员用户。有关此问题和解决方案的更多详细信息,请访问此网页

  • 在跟踪应用程序时,CUPTI 不再关闭 CUDA 图形的性能特性。

  • CUPTI 现在在 CUDA 图形中显示 memset 节点。

  • 修复了异步 cuMemset/cudaMemset 活动的不正确计时问题。

  • 在跟踪路径中完成了一些性能改进。

1.1.18.15. CUDA 10.1 Update 2 中的更新

新功能

  • 此版本专注于 CUPTI 的错误修复和稳定性。

  • 一个安全漏洞问题要求分析工具为非 root 或非管理员用户禁用所有功能。因此,当使用 Windows 419.17 或 Linux 418.43 或更高版本的驱动程序时,CUPTI 无法分析应用程序。有关此问题和解决方案的更多详细信息,请访问此网页

1.1.18.16. CUDA 10.1 Update 1 中的更新

新功能

  • 为 IBM POWER 平台添加了对以下内容的支持

    • cupti_profiler_target.h 标头中的分析 API

    • nvperf_host.hnvperf_target.h 标头中的 Perfworks 指标 API

1.1.18.17. CUDA 10.1 中的更新

新功能

  • 此版本专注于错误修复和性能改进。

  • CUDA Toolkit 10.0 中引入的新分析 API 和 Perfworks 指标 API 现在已集成到 CUDA Toolkit 中分发的 CUPTI 库中。有关新 API 的文档,请参阅 CUPTI 分析 APIPerfworks 指标 API 部分。

  • 事件收集模式 CUPTI_EVENT_COLLECTION_MODE_CONTINUOUS 现在在包括 Geforce 和 Quadro 在内的所有设备类上都受支持。

  • 支持 NVTX 字符串注册 API nvtxDomainRegisterStringA().

  • 添加了枚举 CUpti_PcieGen 以列出 PCIe 代数。

1.1.18.18. CUDA 10.0 中的更新

新功能

  • 为计算能力为 7.5 的设备添加了跟踪支持。

  • 为计算能力为 7.0 及更高版本的设备添加了一组新的指标 API。这些 API 在目标系统上提供低且确定的分析开销。这些 API 目前仅在 Linux x86 64 位和 Windows 64 位平台上受支持。有关文档和下载支持这些新 API 的软件包的详细信息,请参阅 CUPTI 网页。请注意,旧的和新的指标 API 都支持计算能力 7.0。这是为了实现代码向新的指标 API 的过渡。但是,不能混合使用旧的和新的指标 API。

  • CUPTI 支持 OpenMP 应用程序的分析。OpenMP 分析信息以新的活动记录 CUpti_ActivityOpenMp 的形式提供。新的 API cuptiOpenMpInitialize 用于初始化对受支持的 OpenMP 运行时的分析。

  • 内核的活动记录 CUpti_ActivityKernel4 提供了 CUDA 驱动程序设置的共享内存大小。

  • 对 CUDA 图形启动的 CUDA 内核、memcpy 和 memset 节点进行跟踪支持。

  • 为与 CUDA 图形关联的资源添加了资源回调支持。有关新的回调 ID,请参阅枚举 CUpti_CallbackIdResource

1.1.18.19. CUDA 9.2 中的更新

新功能

  • 添加了查询 PCI 设备信息的支持,该信息可用于构建 PCIe 拓扑。请参阅活动类型 CUPTI_ACTIVITY_KIND_PCIE 和相关的活动记录 CUpti_ActivityPcie

  • 为了查看和分析 PCIe 拓扑上的内存传输带宽,添加了一组新的指标来收集通过 PCIe 传输和接收的总数据字节数。这些指标给出了系统中所有设备的累积计数。这些指标是在设备级别为整个应用程序收集的。并且这些指标可用于计算能力为 5.2 及更高版本的设备。

  • CUPTI 添加了对新指标的支持

    • 为不同类型的加载和存储执行的指令

    • 从 SM 到纹理缓存的总缓存全局/本地加载请求数

    • 从纹理缓存写入到 L2 缓存的全局原子/非原子/缩减字节数

    • 从纹理缓存写入到 L2 缓存的表面原子/非原子/缩减字节数

    • 来自纹理缓存的所有请求在 L2 缓存处的命中率

    • 设备内存 (DRAM) 读取和写入字节数

    • 对于计算能力为 7.0 的设备,执行张量核心指令的多处理器功能单元的利用率水平

  • 在枚举 CUpti_EventAttribute 下添加了一个新的属性 CUPTI_EVENT_ATTR_PROFILING_SCOPE,用于查询事件的分析范围。分析范围指示事件是否可以在上下文级别或设备级别或两者都收集。有关可用的分析范围,请参阅枚举 CUpti_EventProfilingScope

  • 添加了一个新的错误代码 CUPTI_ERROR_VIRTUALIZED_DEVICE_NOT_SUPPORTED,以指示不支持在虚拟化 GPU 上进行跟踪和分析。

1.1.18.20. CUDA 9.1 中的更新

新功能

  • 在活动记录 CUpti_ActivityStream 中添加了一个用于关联 ID 的字段。

1.1.18.21. CUDA 9.0 中的更新

新功能

  • CUPTI 扩展了对计算能力为 7.0 的设备的跟踪和分析支持。

  • 可以通过 CUPTI 跟踪计算设备内存的使用情况。添加了一个新的活动记录 CUpti_ActivityMemory 和活动类型 CUPTI_ACTIVITY_KIND_MEMORY 来跟踪内存的分配和释放。此活动记录包括虚拟基地址、大小、PC(程序计数器)、内存分配和释放调用的时间戳等字段。

  • 统一内存分析在 64 位 Linux 平台上为抖动、节流、远程映射和设备到设备迁移添加了新事件。在枚举 CUpti_ActivityUnifiedMemoryCounterKind 下添加了新事件。枚举 CUpti_ActivityUnifiedMemoryRemoteMapCause 列出了远程映射事件的可能原因。

  • PC 采样支持从每个样本 2^5 个周期到 2^31 个周期的广泛采样周期范围。这可以通过 PC 采样配置结构 CUpti_ActivityPCSamplingConfig 中的新字段 samplingPeriod2 来控制。

  • 添加了 API cuptiDeviceSupported() 以检查对计算设备的支持。

  • 用于内核执行的活动记录 CUpti_ActivityKernel3 已被弃用,并被新的活动记录 CUpti_ActivityKernel4 替换。新的记录提供了有关排队和提交时间戳的信息,这有助于确定与内核启动关联的软件和硬件延迟。默认情况下不收集这些时间戳。使用 API cuptiActivityEnableLatencyTimestamps() 启用收集。类型为 CUpti_ActivityLaunchType 的新字段 launchType 可用于确定它是否是协作 CUDA 内核启动。

  • 用于 PC 采样的活动记录 CUpti_ActivityPCSampling2 已被弃用,并被新的活动记录 CUpti_ActivityPCSampling3 替换。新的记录容纳了计算能力为 7.0 及更高版本的设备上支持的 64 位 PC 偏移。

  • 用于 NVLink 属性的活动记录 CUpti_ActivityNvLink 已被弃用,并被新的活动记录 CUpti_ActivityNvLink2 替换。新的记录容纳了两个计算设备之间增加的端口号。

  • 用于源级别全局访问的活动记录 CUpti_ActivityGlobalAccess2 已被弃用,并被新的活动记录 CUpti_ActivityGlobalAccess3 替换。新的记录容纳了计算能力为 7.0 及更高版本的设备上支持的 64 位 PC 偏移。

  • 在活动属性枚举 CUpti_ActivityAttribute 中添加了新的属性 CUPTI_ACTIVITY_ATTR_PROFILING_SEMAPHORE_POOL_SIZECUPTI_ACTIVITY_ATTR_PROFILING_SEMAPHORE_POOL_LIMIT,以设置和获取分析信号量池大小和池限制。

1.1.18.22. CUDA 8.0 中的更新

新功能

  • 程序计数器 (PC) 的采样得到了增强,可以指出真正的延迟问题,它指示 warp 的停顿原因是否真正导致了问题流水线中的停顿。新的活动记录 CUpti_ActivityPCSampling2 的字段 latencySamples 提供了真正的延迟样本。此字段对于计算能力为 6.0 及更高版本的设备有效。有关更多详细信息,请参阅 PC 采样 部分。

  • 通过新的活动记录 CUpti_ActivityNvLink 提供了 NVLink 拓扑信息支持,例如通过 NVLink 连接的设备对、峰值带宽、内存访问权限等。NVLink 性能指标包括每个物理链路的数据传输/接收、传输/接收吞吐量以及相应的标头开销。有关更多详细信息,请参阅 NVLink 部分。

  • CUPTI 支持 OpenACC 应用程序的分析。OpenACC 分析信息以新的活动记录 CUpti_ActivityOpenAccDataCUpti_ActivityOpenAccLaunchCUpti_ActivityOpenAccOther 的形式提供。这有助于将 CPU 上的 OpenACC 构造与 GPU 上发生的相应活动相关联,并将其映射回源代码。新的 API cuptiOpenACCInitialize 用于初始化对受支持的 OpenACC 运行时的分析。有关更多详细信息,请参阅 OpenACC 部分。

  • 统一内存分析在计算能力为 6.0 的设备和 64 位 Linux 平台上提供 GPU 页面错误事件。枚举 CUpti_ActivityUnifiedMemoryAccessType 列出了 GPU 页面错误事件的内存访问类型,枚举 CUpti_ActivityUnifiedMemoryMigrationCause 列出了数据传输事件的迁移原因。

  • 统一内存分析支持扩展到 Mac 平台。

  • 支持 16 位浮点 (FP16) 数据格式分析。支持新的指标 inst_fp_16、flop_count_hp_add、flop_count_hp_mul、flop_count_hp_fma、flop_count_hp、flop_hp_efficiency、half_precision_fu_utilization。可以使用添加到 CUpti_DeviceAttribute 的枚举 CUPTI_DEVICE_ATTR_FLOP_HP_PER_CYCLE 查询设备的峰值 FP16 flops/周期。

  • 添加了新的活动类型 CUPTI_ACTIVITY_KIND_SYNCHRONIZATIONCUPTI_ACTIVITY_KIND_STREAMCUPTI_ACTIVITY_KIND_CUDA_EVENT,以支持跟踪 CUDA 同步构造,例如上下文、流和 CUDA 事件同步。同步详细信息以新的活动记录 CUpti_ActivitySynchronization 的形式提供。枚举 CUpti_ActivitySynchronizationType 列出了不同类型的 CUDA 同步构造。

  • API cuptiSetThreadIdType()/cuptiGetThreadIdType() 用于设置/获取用于在 CUPTI 记录中获取线程 ID 的机制。枚举 CUpti_ActivityThreadIdType 列出了所有受支持的机制。

  • 添加了 API cuptiComputeCapabilitySupported() 以检查 CUPTI 对特定计算能力的支持。

  • 添加了支持以建立外部 API(例如 OpenACC、OpenMP)和 CUPTI API 活动记录之间的关联。API cuptiActivityPushExternalCorrelationId()cuptiActivityPopExternalCorrelationId() 应用于推送和弹出调用线程的外部关联 ID。类型为 CUpti_ActivityExternalCorrelation 的生成记录包含外部和 CUPTI 分配的关联 ID。

  • 添加了容器以活动记录 CUpti_ActivityInstantaneousEventCUpti_ActivityInstantaneousEventInstanceCUpti_ActivityInstantaneousMetricCUpti_ActivityInstantaneousMetricInstance 的形式存储事件和指标的信息。这些活动记录不是由 CUPTI 生成的,包含这些记录是为了完整性和易用性。构建在 CUPTI 之上的、对事件进行采样的分析器可以选择使用这些记录来存储收集的事件数据。

  • 在 NVTX v2 中添加了对域和同步对象的注释的支持。添加了新的活动记录 CUpti_ActivityMarker2 和枚举以指示同步对象的各个阶段,即 CUPTI_ACTIVITY_FLAG_MARKER_SYNC_ACQUIRECUPTI_ACTIVITY_FLAG_MARKER_SYNC_ACQUIRE_SUCCESSCUPTI_ACTIVITY_FLAG_MARKER_SYNC_ACQUIRE_FAILEDCUPTI_ACTIVITY_FLAG_MARKER_SYNC_RELEASE

  • 活动记录 CUpti_ActivityMemset 的未使用字段 runtimeCorrelationId 被分解为两个字段 flagsmemoryKind,以指示 memset 操作的异步行为和内存类型。新的标志 CUPTI_ACTIVITY_FLAG_MEMSET_ASYNC 在枚举 CUpti_ActivityFlag 中添加,从而支持了这一点。

  • 在枚举 CUpti_ActivityMemoryKind 中添加了标志 CUPTI_ACTIVITY_MEMORY_KIND_MANAGED 以指示托管内存。

  • API cuptiGetStreamId 已被弃用。引入了一个新的 API cuptiGetStreamIdEx,以基于传统或每个线程的默认流标志提供流 ID。

1.1.18.23. CUDA 7.5 中的更新

新功能

  • 默认情况下启用设备范围的程序计数器 (PC) 采样。这是 CUDA Toolkit 7.0 版本中的预览功能,默认情况下未启用。

  • 在 GPU 上存在多个上下文的情况下,对于计算能力为 5.x 的设备,扩展了准确收集所有事件和指标的能力。

  • 引入了 API cuptiGetLastError 以返回同一主机线程中的任何 CUPTI API 调用或回调产生的最后一个错误。

  • 统一内存分析支持 MPS(多进程服务)

  • 在每次内核运行期间的内核重放之后,提供回调以收集重放信息。请参阅 API cuptiKernelReplaySubscribeUpdate 和回调类型 CUpti_KernelReplayUpdateFunc

  • 在枚举 CUpti_DeviceAttribute 中添加了新的属性,以查询设备函数的不同缓存首选项的最大共享内存大小。

1.1.18.24. CUDA 7.0 中的更新

新功能

  • CUPTI 支持设备范围的程序计数器 (PC) 采样。以固定的频率按轮询顺序对来自所有活动 warp 的程序计数器以及停顿原因进行采样。活动记录 CUpti_ActivityPCSampling 使用活动类型 CUPTI_ACTIVITY_KIND_PC_SAMPLING 启用,输出停顿原因以及 PC 和其他相关信息。枚举 CUpti_ActivityPCSamplingStallReason 列出了所有停顿原因。采样周期是可配置的,可以使用 API cuptiActivityConfigurePCSampling 进行调整。此功能在计算能力为 5.2 的设备上可用。

  • 添加了新的活动记录 CUpti_ActivityInstructionCorrelation,可用于转储函数的所有 PC 的源定位器记录。

  • 在 GPU 上存在多个上下文的情况下,对于计算能力为 3.x 和 5.0 的设备,可以准确收集所有事件和指标。在以前的版本中,当多个上下文在 GPU 上执行时,只能准确收集某些事件和指标。

  • 通过提供与 GPU 之间更精细的数据传输,以及每次传输更精确的时间戳,统一内存分析得到了增强。此信息通过新的活动记录 CUpti_ActivityUnifiedMemoryCounter2 提供,弃用了旧记录 CUpti_ActivityUnifiedMemoryCounter

  • MPS 跟踪和分析支持在多 GPU 设置上得到了扩展。

  • 用于设备信息的活动记录 CUpti_ActivityDevice 已被弃用,并被新的活动记录 CUpti_ActivityDevice2 替换。新的记录添加了设备 UUID,可用于在分析器运行之间唯一标识设备。

  • 用于内核执行的活动记录 CUpti_ActivityKernel2 已被弃用,并被新的活动记录 CUpti_ActivityKernel3 替换。新的记录提供了有关请求和执行的全局分区缓存配置的信息。分区全局缓存对占用率计算有影响。如果它处于启用状态,则 CTA 只能使用一半的 SM,因此只能使用每个 SM 可用寄存器的一半。新的字段适用于计算能力为 5.2 及更高版本的设备。请注意,此更改是在 CUDA 6.5 版本中完成的,并支持计算能力 5.2。

1.1.18.25. CUDA 6.5 中的更新

新功能

  • 为源相关的指令执行活动 CUpti_ActivityInstructionExecution 完成了指令分类。有关指令类,请参阅 CUpti_ActivityInstructionClass

  • 在活动 CUpti_DeviceAttribute 中添加了两个新的设备属性

    • CUPTI_DEVICE_ATTR_FLOP_SP_PER_CYCLE 给出了 GPU 的峰值单精度 flop/周期。

    • CUPTI_DEVICE_ATTR_FLOP_DP_PER_CYCLE 给出了 GPU 的峰值双精度 flop/周期。

  • 添加了两个新的指标属性

    • CUPTI_METRIC_PROPERTY_FLOP_SP_PER_CYCLE 给出了 GPU 的峰值单精度 flop/周期。

    • CUPTI_METRIC_PROPERTY_FLOP_DP_PER_CYCLE 给出了 GPU 的峰值双精度 flop/周期。

  • 用于源级别全局访问信息的活动记录 CUpti_ActivityGlobalAccess 已被弃用,并被新的活动记录 CUpti_ActivityGlobalAccess2 替换。新的记录还提供了将 SASS 汇编指令映射到 CUDA C 源代码所需的信息。并且它还基于访问模式提供了理想的 L2 事务计数。

  • 用于源级别分支信息的活动记录 CUpti_ActivityBranch 已被弃用,并被新的活动记录 CUpti_ActivityBranch2 替换。新的记录还提供了将 SASS 汇编指令映射到 CUDA C 源代码所需的信息。

  • 添加了示例 sass_source_map 以演示 SASS 汇编指令到 CUDA C 源代码的映射。

  • 默认事件收集模式从连续模式 (CUPTI_EVENT_COLLECTION_MODE_CONTINUOUS) 更改为内核模式 (CUPTI_EVENT_COLLECTION_MODE_KERNEL)。此外,连续模式仅在 Tesla 设备上受支持。

  • 当启用自动加速时,分析结果可能不一致。分析器默认情况下尝试禁用自动加速,但在某些情况下可能无法做到这一点,但分析将继续进行。添加了一个新的 API cuptiGetAutoBoostState 以查询设备的自动加速状态。在不支持自动加速的设备上,此 API 返回错误 CUPTI_ERROR_NOT_SUPPORTED。请注意,自动加速仅在 Kepler+ 系列的某些 Tesla 设备上受支持。

  • 用于内核执行的活动记录 CUpti_ActivityKernel2 已被弃用,并被新的活动记录 CUpti_ActivityKernel3 替换。新的记录还提供了有关请求和执行的全局分区缓存配置的信息。新的字段适用于 5.2 计算能力的设备。

1.1.18.26. CUDA 6.0 中的更新

新功能

  • 引入了两种新的 CUPTI 活动类型,以启用两种新的源相关数据收集类型。指令执行 类型收集 SASS 级别的指令执行计数、发散数据和谓词数据。共享访问 类型收集源相关数据,指示低效的共享内存访问。

  • CUPTI 为使用统一内存的 CUDA 应用程序提供支持。新的活动记录报告统一内存活动,例如与 GPU 之间的传输以及与统一内存相关的页面错误数。

  • CUPTI 识别并报告 CUDA 应用程序在启用 MPS 的系统上运行时使用的特殊 MPS 上下文。

  • CUpti_ActivityContext 活动记录 CUpti_ActivityContext 已更新,以向后兼容的方式在结构中引入一个新字段。32 位 computeApiKind 字段被替换为两个 16 位字段,computeApiKinddefaultStreamId。由于所有有效的 computeApiKind 值都适合 16 位,并且由于所有受支持的 CUDA 平台都是小端字节序,因此使用新结构读取的持久上下文记录数据将具有 computeApiKind 的正确值,并且 defaultStreamId 的值为零。CUPTI 客户端负责对持久上下文数据进行版本控制,以识别 defaultStreamId 字段何时有效。

  • 为了确保尽可能准确地计算指标值,引入了一个新的指标 API。函数 cuptiMetricGetRequiredEventGroupSets 可用于获取应同时收集的事件组集合。

  • CUPTI 引入的执行开销已大大降低。

  • 需要 CUDA Toolkit 5.5 中引入的新的活动缓冲区 API。旧的 cuptiActivityEnqueueBuffercuptiActivityDequeueBuffer 函数已被删除。

1.1.18.27. CUDA 5.5 中的更新

新功能

  • 可以使用 CUPTI 分析使用 CUDA 动态并行性的应用程序。设备端内核启动使用新的活动类型报告。

  • 设备属性,例如功耗、时钟、散热等,通过一种新的活动类型报告。

  • 一种新的活动缓冲区 API 使用回调来请求和返回活动记录缓冲区。现有的 cuptiActivityEnqueueBuffercuptiActivityDequeueBuffer 函数仍然受支持,但已弃用,将在未来的版本中移除。

  • 事件 API 支持内核重放,以便在应用程序的单次运行期间可以收集任意数量的事件。

  • 一种新的指标 API cuptiMetricGetValue2 允许计算任何设备的指标值,即使该设备在系统上不可用。

  • CUDA 对等内存复制通过活动 API 显式报告。在以前的版本中,这些内存复制仅被部分报告。

1.2. 已知问题

以下是当前版本的已知问题。

  • 一个安全漏洞问题要求分析工具在使用 Windows 419.17 或 Linux 418.43 或更高版本的驱动程序时,为非 root 或非管理员用户禁用使用 GPU 性能计数器的功能。默认情况下,NVIDIA 驱动程序需要提升的权限才能访问 GPU 性能计数器。在 Tegra 平台上,请以 root 用户身份或使用 sudo 进行分析。在其他平台上,您可以以 root 用户身份或使用 sudo 启动分析,或者启用非管理员分析。有关该问题和解决方案的更多详细信息,请访问 ERR_NVGPUCTRPERM 网页

    注意

    CUPTI 仅允许在桌面平台上为非 root 和非管理员用户启用跟踪功能,Tegra 平台需要 root 或 sudo 访问权限。

  • 当启用自动加速时,分析结果可能不一致。分析器默认尝试禁用自动加速。但在某些情况下,它可能无法做到这一点,分析将继续,结果将不一致。API cuptiGetAutoBoostState() 可用于查询设备的自动加速状态。在不支持自动加速的设备上,此 API 返回错误 CUPTI_ERROR_NOT_SUPPORTED。请注意,自动加速仅在某些计算能力为 3.0 及更高的 Tesla 设备上受支持。

  • CUPTI 不会填充已弃用的活动结构,而是用更新版本的活动结构填充信息。

  • 由于 Windows 上计时器的分辨率较低,对于 Windows 上执行时间短的活动,开始和结束时间戳可能相同。

  • 调用 CUPTI API 的应用程序不能与 Nvidia 工具一起使用,例如 nvprofNvidia Visual ProfilerNsight ComputeNsight SystemsNvidia Nsight Visual Studio Editioncuda-gdbcuda-memcheck

  • 当在 CUDA 初始化之后延迟初始化 CUPTI 时,使用 API cuptiActivityEnable 启用的 PCIe 和 NVLink 记录不会被捕获。API cuptiActivityEnableAndDump 可用于在分析会话期间的任何时候转储这些活动的记录。

  • 当与应用程序链接的 OpenACC 库缺少 OpenACC API 例程的定义时,CUPTI 无法分析 OpenACC 应用程序。这由错误代码 CUPTI_ERROR_OPENACC_UNDEFINED_ROUTINE 指示。

  • 当 OpenACC 库静态链接到用户应用程序中时,OpenACC 分析可能会失败。发生这种情况的原因是缺少 OpenACC 分析所需的 OpenACC API 例程的定义,因为编译器可能会忽略应用程序中未使用的函数的定义。可以通过动态链接 OpenACC 库来缓解此问题。

  • ARM 架构不支持统一内存分析。

  • 在全局范围内重载 new 运算符并在重载的 new 运算符内部使用任何 CUDA API(如 cudaMalloc() 或 cudaMallocManaged())的 C++ 应用程序将导致挂起。

  • 计算能力为 6.0 及更高的设备引入了一项新功能,计算抢占,以便在运行长时间任务时为所有计算上下文提供公平的机会。使用计算抢占功能 -

    • 如果多个上下文并行运行,则长时间运行的内核可能会被抢占。

    • 由于上下文的时间片到期,某些内核可能会偶尔被抢占。

    如果内核已被抢占,则内核花费在抢占上的时间仍计入内核持续时间。

计算抢占会影响事件和指标收集。以下是当前版本的已知问题

  • 对于 MPS 客户端,在计算能力为 7.0 及更高的设备上收集事件和指标可能会导致高于预期的计数,因为 MPS 客户端可能会因另一个 MPS 客户端的终止而被抢占。

  • 事件 warps_launched 和 sm_cta_launched 以及指标 inst_per_warp 在计算能力为 6.0 及更高的设备上可能会提供高于预期的计数。指标 unique_warps_launched 可以代替 warps_launched 使用,以获得实际启动的 warp 的正确计数,因为它不受计算抢占的影响。

    为避免计算抢占影响分析器结果,请尝试隔离正在分析的上下文

    • 在未连接显示器的辅助 GPU 上运行应用程序。

    • 在 Linux 上,如果应用程序在连接了显示驱动程序的主 GPU 上运行,则卸载显示驱动程序。

    • 一次只运行一个使用 GPU 的进程。

  • 计算能力为 6.0 及更高的设备支持按需分页。当内核首次被调度时,所有使用 cudaMallocManaged 分配且内核执行所需的页面都会在生成 GPU 错误时被提取到全局内存中。分析器需要多次传递才能收集内核分析所需的所有指标。内核状态需要为每个内核重放传递保存和恢复。对于计算能力为 6.0 及更高且支持统一内存的平台,在第一个内核迭代中,将生成 GPU 页面错误,并且所有页面都将被提取到全局内存中。从第二个迭代开始,不会发生 GPU 页面错误。这将显着影响内存相关事件和计时。从跟踪获取的时间将包括提取页面所需的时间,但多次迭代中分析的大多数指标将不包括提取页面所需的时间/周期。这会导致分析器结果不一致。

  • 当分析使用 CUDA 动态并行性 (CDP) 的应用程序时,分析工具有一些限制。CUDA 12.0 添加了对改进的 CUDA 动态并行性 API(称为 CDP2)的支持,与旧版 CUDA 动态并行性 API(称为 CDP1)相比,提供了显着的性能改进。

    • 对于旧版 CUDA 动态并行性 (CDP1),CUPTI 支持跟踪计算能力为 5.x 和 6.x 的设备的所有主机和设备内核。对于计算能力为 7.0 及更高的设备,CUPTI 跟踪所有主机启动的内核,直到遇到启动子内核的主机启动内核;后续内核不被跟踪。

    • 对于 CUDA 动态并行性 (CDP2),CUPTI 仅支持跟踪主机启动的内核,它无法跟踪设备启动的内核。

    • CUPTI 不报告设备启动内核的 CUDA API 调用。

    • CUPTI 不支持分析设备启动的内核,即它不报告设备启动内核的详细事件、指标和源代码级结果。为 CPU 启动的内核收集的事件、指标和源代码级结果将包括从该内核内启动的内核的整个调用树的事件、指标和源代码级结果。

  • 当分析使用 CUDA 设备图的应用程序时,分析工具有一些限制。

    • 当设备图从主机启动时,CUPTI 会跟踪设备图。当图从设备启动时,支持图级别跟踪,但不支持节点级别跟踪。

  • samples autorange_profiling 和 userrange_profiling 的编译需要支持 C++11 功能的主机编译器。对于某些 g++ 编译器,需要使用标志 -std=c++11 来启用 C++11 功能。

  • Tegra 平台不支持 PC 采样活动 API,而 Tegra 平台支持 PC 采样 API。

  • 从 CUDA 11.4 和 R470 TRD1 驱动程序版本开始,CUPTI 在 vGPU 环境中受支持,这需要 vGPU 许可证。如果 20 分钟后未获得许可证,则报告的性能数据(包括来自 GPU 的指标)将不准确。这是因为 vGPU 环境中的一项功能会降低性能,但保留了 此处 指定的功能。

  • NVIDIA 加密货币挖矿处理器 (CMP) 不支持 CUPTI。这使用错误代码 CUPTI_ERROR_CMP_DEVICE_NOT_SUPPORTED 报告。有关更多信息,请访问 网页

  • CUDA Toolkit 11.7 和 CUDA Toolkit 11.8 中附带的 CUPTI 版本不支持 Kepler (sm_35 和 sm_37) 设备。有关支持这些 Kepler 设备的 CUPTI 软件包的位置,请参阅网页 CUPTI 11.7CUPTI 11.8

  • CUDA 11.6 版本中添加了对 GA103 GPU 的支持,但在 CUDA 11.8 到 CUDA 12.2 Update 1 的版本中被破坏。

  • Windows 平台上 Maxwell 设备不支持统一内存分析。

  • 对于保密计算设备,不支持为并发内核跟踪的分析缓冲区分配pinned(页锁定)主机内存。设置活动属性枚举 CUpti_ActivityAttribute 的属性 CUPTI_ACTIVITY_ATTR_MEM_ALLOCATION_TYPE_HOST_PINNED 将返回错误代码 CUPTI_ERROR_NOT_SUPPORTED

  • 芯片到芯片 (C2C) 互连没有跟踪和分析支持。

  • 使用新的 PC 采样 API,CUPTI 不报告串行模式下 CUDA 图启动的任何 pc 采样数据。

  • 将 CUPTI 附加到正在运行的进程可能会有很长的延迟。如果线程无法访问执行附加操作所需的资源,则该线程可能会饿死,因为其他线程具有更高的优先级或持有这些资源的锁。

  • 对于 pre-Hopper 架构,MPS 下的协作内核启动不支持并发内核跟踪,并且可能导致挂起。

  • 基于硬件事件的内核跟踪不支持延迟时间戳,即排队和提交时间戳。

1.2.1. 分析

以下是事件 API、指标 API、范围分析 API 和分析 API 的常见已知问题

  • 分析可能会显着改变应用程序的整体性能特征。有关更多详细信息,请参阅 CUPTI 开销 部分。

  • 在同一设备上其他上下文处于活动状态时(例如,X 服务器或辅助 CUDA 或图形应用程序)分析内核可能会导致 L2/FB(设备内存)相关指标的指标值发生变化。具体而言,来自非分析上下文的 L2/FB 流量无法从指标结果中排除。为了完全避免此问题,请在没有辅助上下文访问同一设备的 GPU 上分析应用程序(例如,Linux 上没有 X 服务器)。

  • 不支持对多设备协作内核进行分析,即使用 API 函数 cudaLaunchCooperativeKernelMultiDevicecuLaunchCooperativeKernelMultiDevice 启动的内核。

  • 启用某些事件可能会导致 GPU 内核运行时间超过驱动程序的 watchdog 超时限制。在这些情况下,驱动程序将终止 GPU 内核,从而导致应用程序错误,并且分析数据将不可用。请在分析此类长时间运行的 CUDA 内核之前禁用驱动程序 watchdog 超时。

  • 从此 NVIDIA 开发者工具站点计算的操作/秒值以及使用数据中心监控工具生成的操作/秒值与用于出口管制目的的操作/秒值的计算方式不同,不应依赖这些值来评估是否符合出口管制限制。

1.2.1.1. 事件和指标 API

以下是与事件和指标 API 相关的已知问题

  • 来自头文件 cupti_events.h 的 CUPTI 事件 API 和来自头文件 cupti_metrics.h指标 API 不支持计算能力为 7.5 及更高的设备。建议改用 CUPTI 范围分析 API。有关更多详细信息,请参阅 分析 API 的演变 部分。

  • 在连续模式下收集事件时,事件报告可能会延迟,即事件值可能会通过稍后调用 readEvent(s) API 返回,并且最后一次 readEvent(s) API 的事件值可能会丢失。

  • 当分析事件时,由于域实例上缺少工作负载,被分析的域实例可能会给出事件值 0,因为 CUPTI 默认分析域的一个实例。要分析域的所有实例,用户可以通过 API cuptiEventGroupSetAttribute() 设置事件组属性 CUPTI_EVENT_GROUP_ATTR_PROFILE_ALL_DOMAIN_INSTANCES

  • 对于计算能力为 6.0 和 6.1 的设备,使用早于 9.0 版本的 nvcc 编译的 CUDA 应用程序,分析结果可能不正确。分析会话将继续,CUPTI 将使用错误代码 CUPTI_ERROR_CUDA_COMPILER_NOT_COMPATIBLE 通知它。建议使用 nvcc 版本 9.0 或更高版本重新编译应用程序代码。如果代码已使用推荐的 nvcc 版本编译,请忽略此警告。

  • 对于某些指标,所需的事件只能为一个 CUDA 上下文收集。对于使用多个 CUDA 上下文的应用程序,这些指标将仅为一个上下文收集。《指标参考表》中指出了只能为一个 CUDA 上下文收集的指标。

  • 一些指标值的计算假设内核足够大,可以占用所有设备多处理器,并且工作量大致相同。如果内核启动不具有此特征,则这些指标值可能不准确。

  • 并非所有设备都提供某些事件和指标。有关指标列表,您可以参考《指标参考表》。

  • CUPTI 可能会因事件和指标分析而给出内存不足错误,这可能是由于内核中的指令数量过多所致。

  • CUDA 图启动的 CUDA 内核节点不支持分析。

  • 以下系统配置不支持这些 API

    • 64 位 ARM 服务器 CPU 架构 (arm64 SBSA)。

    • 虚拟 GPU (vGPU)。

    • 适用于 Linux 的 Windows 子系统 (WSL)。

1.2.1.2. 分析和范围分析 API

以下是分析 API 和范围分析 API 的常见已知问题

  • 在任何其他 GPU 工作正在同一 MIG 计算实例上执行时分析内核可能会导致所有单元的指标值发生变化。应注意序列化或以其他方式防止目标应用程序中并发 CUDA 启动,以确保这些内核不会相互影响。请注意,通过目标进程中的其他 API 发出的 GPU 工作或由在同一 MIG 计算实例中同时运行的非目标进程创建的工作负载将影响收集的指标。请注意,在其他 MIG 计算实例中运行 CUDA 进程是可以接受的,因为它们不会影响分析的 MIG 计算实例。

  • 范围分析 API 支持 NVLink 性能指标 (nvlrx__*nvltx__*),但分析 API 不支持。

  • MPS(多进程服务)下不支持分析。

  • 对于分析 CUDA 图启动的 CUDA 内核节点,并非所有范围分析和重放模式的组合都受支持。以下是一些限制

    • 用户重放和自动范围的应用重放模式不受支持。

    • 在用户范围模式下,整个图作为一个工作负载进行分析,即 CUDA 图启动的所有内核节点都将被分析,并且将提供单个结果,用户无法对一系列内核进行分析。

    • 对于自动范围和内核重放模式下的设备图分析,将分析每个内核节点,除了启动设备图的节点。

  • 不支持分析在 SLI 组中设备的内核执行。

  • Windows 子系统 for Linux (WSL) 上的分析仅在 WSL 版本 2、NVIDIA 显示驱动程序版本 525 或更高版本以及 Windows 11 上受支持。

  • 使用 Green Contexts 的应用程序不支持分析。

  • 不支持分析实例化后已更新的设备图。

1.3. 支持

有关受支持平台和 GPU 的信息。

1.3.1. 平台支持

表 1. CUPTI 支持的平台

平台

支持

Windows

适用于 Linux 版本 2 的 Windows 子系统 (WSL 2)

是*

Linux (x86_64)

Linux (aarch64 sbsa)

是*

Linux (x86_64) (Drive SDK)

是*

Linux (aarch64)

是*

Linux (ppc64le)

QNX

是*

Mac OSX

Android

不支持 32 位进程的跟踪和分析。

Linux (aarch64 sbsa) 和 WSL 2 平台不支持事件和指标 API。

1.3.2. GPU 支持

表 2. 不同 CUPTI API 支持的 GPU 架构

CUPTI API

支持的 GPU 架构

注释

活动

Maxwell 及更高版本的 GPU 架构,即计算能力为 5.0 及更高的设备

回调

Maxwell 及更高版本的 GPU 架构,即计算能力为 5.0 及更高的设备

主机分析

Volta 及更高版本的 GPU 架构,即计算能力为 7.0 及更高的设备

Maxwell 和 Pascal GPU 上不支持

范围分析

Volta 及更高版本的 GPU 架构,即计算能力为 7.0 及更高的设备

Maxwell 和 Pascal GPU 上不支持

PC 采样

Volta 及更高版本的 GPU 架构,即计算能力为 7.0 及更高的设备

Maxwell 和 Pascal GPU 上不支持

SASS 指标

Volta 及更高版本的 GPU 架构,即计算能力为 7.0 及更高的设备

Maxwell 和 Pascal GPU 上不支持

PM 采样

Turing 及更高版本的 GPU 架构,即计算能力为 7.5 及更高的设备

Maxwell、Pascal 和 Volta GPU 上不支持

分析

Volta 及更高版本的 GPU 架构,即计算能力为 7.0 及更高的设备

Maxwell 和 Pascal GPU 上不支持

事件

Maxwell、Pascal 和 Volta

Turing 及更高版本的 GPU 架构,即计算能力为 7.5 及更高的设备上不支持

指标

Maxwell、Pascal 和 Volta

Turing 及更高版本的 GPU 架构,即计算能力为 7.5 及更高的设备上不支持

检查点

Volta 及更高版本的 GPU 架构,即计算能力为 7.0 及更高的设备

Maxwell 和 Pascal GPU 上不支持