4.1。 CUDA 主机 API

原文: http://numba.pydata.org/numba-doc/latest/cuda-reference/host.html

4.1.1。设备管理

4.1.1.1。设备检测和查询

以下功能可用于查询可用硬件:

  1. numba.cuda.is_available()

返回一个布尔值以指示 CUDA GPU 的可用性。

如果尚未初始化,则会初始化驱动程序。

  1. numba.cuda.detect()

检测支持的 CUDA 硬件并打印检测到的硬件的摘要。

返回一个布尔值,指示是否检测到任何支持的设备。

4.1.1.2。上下文管理

CUDA Python 函数在 CUDA 上下文中执行。系统中的每个 CUDA 设备都有一个相关的 CUDA 上下文,Numba 目前每个线程只允许一个上下文。有关 CUDA 上下文的更多详细信息,请参阅上下文管理上的 CUDA 驱动程序 API 文档和 CUDA C 编程指南上下文文档。 CUDA 上下文是 Context 类的实例:

  1. class numba.cuda.cudadrv.driver.Context(device, handle)

此对象包装 CUDA Context 资源。

上下文不应由用户代码直接构造。

  1. get_memory_info()

在上下文中以字节为单位返回(空闲,总计)内存。

  1. pop()

从当前 CPU 线程弹出此上下文。请注意,此上下文必须位于上下文堆栈的顶部,否则将发生错误。

  1. push()

在当前 CPU 线程上推送此上下文。

  1. reset()

在此上下文中清理所有拥有的资源。

以下函数可用于获取或选择上下文:

  1. numba.cuda.current_context(devnum=0)

获取当前设备或按设备编号使用设备,并返回 CUDA 上下文。

  1. numba.cuda.require_context(fn)

执行 fn 时,确保 CUDA 上下文可用的装饰器。

装饰 fn 相当于写作:

  1. get_context()
  2. fn()

在每个呼叫站点。

以下函数会影响当前上下文:

  1. numba.cuda.synchronize()

同步当前上下文。

  1. numba.cuda.close()

显式清除当前线程中的所有上下文,如果当前线程是主线程,则销毁所有上下文。

4.1.1.3。设备管理

Numba 维护了支持 CUDA 的设备列表:

  1. numba.cuda.gpus

支持的 CUDA 设备的可索引列表。此列表由整数设备 ID 索引。

或者,可以获得当前设备:

  1. numba.cuda.gpus.current()

返回当前选定的设备。

通过 numba.cuda.gpus 获取设备始终提供 numba.cuda.cudadrv.devices._DeviceContextManager 的实例,它充当所选设备的上下文管理器:

  1. class numba.cuda.cudadrv.devices._DeviceContextManager(device)

提供上下文管理器,用于在所选设备的上下文中执行。这种类型的实例的正常使用来自numba.cuda.gpus。例如,要在设备 2 上执行:

  1. with numba.cuda.gpus[2]:
  2. d_a = numba.cuda.to_device(a)

将数组 复制到设备 2 上,由 d_a 引用。

也可以使用以下三个功能选择上下文和设备或获取当前设备:

  1. numba.cuda.select_device(device_id)

使与设备 device_id 关联的上下文成为当前上下文。

返回 Device 实例。

出错时引发异常。

  1. numba.cuda.get_current_device()

获取与当前线程关联的当前设备

  1. numba.cuda.list_devices()

返回所有检测到的设备的列表

numba.cuda.cudadrv.driver.Device 类可用于查询所选设备的功能:

  1. class numba.cuda.cudadrv.driver.Device

与特定上下文关联的设备。

  1. compute_capability

元组 (主要,次要) 表示支持的计算能力。

  1. id

设备的整数 ID。

  1. name

设备名称(例如“GeForce GTX 970”)

  1. reset()

删除设备的上下文。这将破坏在上下文中创建的所有内存分配,事件和流。

4.1.2。测量

4.1.2.1。分析

NVidia Visual Profiler 可以直接用于执行 CUDA Python 代码 - 不需要将对这些函数的调用插入到用户代码中。但是,这些功能可用于允许在代码的特定部分上有选择地执行分析。有关分析的更多信息,请参阅 NVidia Profiler 用户指南

  1. numba.cuda.profile_start()

在当前上下文中启用配置文件集合。

  1. numba.cuda.profile_stop()

在当前上下文中禁用概要文件集合。

  1. numba.cuda.profiling()

上下文管理器,可以在进入时进行分析并在退出时禁用分析。

4.1.2.2。事件

事件可用于监视执行进度并记录到达的特定点的时间戳。事件创建立即返回,可以查询创建的事件以确定是否已到达。有关详细信息,请参阅 CUDA C 编程指南事件部分

以下函数用于创建和测量事件之间的时间:

  1. numba.cuda.event(timing=True)

创建 CUDA 事件。如果使用timing=True创建定时数据,则仅由事件记录定时数据。

  1. numba.cuda.event_elapsed_time(evtstart, evtend)

计算两个事件之间的经过时间(以毫秒为单位)。

事件是 numba.cuda.cudadrv.driver.Event 类的实例:

  1. class numba.cuda.cudadrv.driver.Event(context, handle, finalizer=None)
  1. query()

如果最近记录之前的所有工作都已完成,则返回 True;否则,返回 False。

  1. record(stream=0)

将事件的记录点设置为给定流中的当前点。

当调用record()时在流中排队的所有工作都已完成时,将认为该事件已发生。

  1. synchronize()

同步主机线程以完成事件。

  1. wait(stream=0)

提交给流的所有未来工作将等到事件完成。

4.1.3。流管理

Streams 允许在给定上下文中的单个设备上执行并发。同一流中的排队工作项按顺序执行,但不同流中的工作项可以同时执行。涉及 CUDA 设备的大多数操作可以使用流异步执行,包括数据传输和内核执行。有关流的更多详细信息,请参见 CUDA C 编程指南流

要创建流:

  1. numba.cuda.stream()

创建表示设备命令队列的 CUDA 流。

流是 numba.cuda.cudadrv.driver.Stream 的实例:

  1. class numba.cuda.cudadrv.driver.Stream(context, handle, finalizer)
  1. auto_synchronize()

一个上下文管理器,它等待此流中的所有命令执行并在退出上下文时提交任何挂起的内存传输。

  1. synchronize()

等待此流中的所有命令执行。这将提交任何挂起的内存传输。