torch.cuda.nvtx 的源代码
# mypy: 允许未类型化定义
r该软件包增加了对 NVIDIA 工具扩展(NVTX)的支持,用于性能分析。
来自 contextlib
导入 contextmanager
尝试:
来自 torch._C
导入 _nvtx
除了
导入错误:
类 _NVTXStub:
@staticmethod
def _fail(*参数, **kwargs):
抛出
运行时错误(
"NVTX 函数未安装。您确定您有 CUDA 构建吗?"
)
rangePushA = _fail
rangePop = 失败
标记 A =
失败
_nvtx = _NVTXStub() # 类型:忽略[赋值]
全部 = [
范围推送,
范围弹出,
范围开始, "range_end",
"标记",
"范围"]
[文档]def 范围压入(msg):
"空行"
将一个范围推入嵌套范围栈。返回开始范围的基础索引深度。
参数:
msg (str): 与范围关联的 ASCII 消息
"""
返回_nvtx.rangePushA(msg)
[文档]def range_pop():
"""从嵌套范围跨度堆栈中弹出范围。返回结束的范围的零基深度。"""
return _nvtx.rangePop()
def 范围结束(
信息) -> int:
""
用字符串消息标记范围开始。它返回一个唯一句柄
用于将此范围传递给相应的 rangeEnd()调用。
这是一个与 range_push/range_pop 的关键区别是,
范围起始/范围结束版本支持跨线程的范围(在一个线程上开始)
线程在另一个线程上开始和结束。
返回:一个范围句柄(uint64_t),可以传递给 range_end()。
参数:
msg (str):与范围关联的 ASCII 消息。
"""
返回 _nvtx.rangeStartA(
信息)
def range_end(范围标识符) ->
无:
""
为给定的范围标识符标记范围的结束。
参数:
range_id (int):起始范围的唯一句柄。
"""
_nvtx.范围结束(
范围 ID)
def _设备范围开始(
信息: str,
流:
整型 = 0) ->
对象:
""
标记字符串消息范围的开始。
返回一个不透明的堆分配句柄,用于传递给对应的 device_range_end() 调用。
与 range_start 的一个关键区别是,它
与 range_start 的一个关键区别是,它
范围开始标记立即标识范围,而_device_range_start
一旦所有 CUDA 流上的任务完成,就立即标记范围的开始。
返回:一个不透明的堆分配句柄,应传递给_device_range_end()。
返回值:一个不透明的堆分配句柄,应传递给_device_range_end()。
参数:
msg (str):与范围关联的 ASCII 消息。
stream (int):CUDA 流 ID。
"""
返回 _nvtx.deviceRangeStart(
信息,
流)
def _设备范围结束(
范围处理:
对象,
流:
整型 = 0) ->
无:
""
当 CUDA 流上的所有任务完成后,立即标记给定范围处理器的范围结束。
当 CUDA 流上的所有任务完成后,立即标记给定范围处理器的范围结束。
参数:
范围句柄:起始范围的唯一句柄。
流(整型):CUDA 流 ID。
"""
_nvtx.deviceRangeEnd(范围处理,
流)
[文档]def mark(msg):
"""
描述在某个时刻发生的瞬时事件。
Args:
消息 (str): 与事件关联的 ASCII 消息。
"""
return _nvtx.markA(msg)
[文档]@contextmanager
def range(msg, *args, **kwargs):
"""
上下文管理器/装饰器,在开始处推送一个 NVTX 范围
范围内,并在末尾弹出。如果提供了额外的参数,
它们将被作为参数传递给 msg.format()。
参数:
msg (str): 与范围关联的消息
"""
range_push(msg.format(*args, **kwargs))
try:
yield
finally:
range_pop()