4.16.1. CPU 和内存亲和性
[设备查询]
本章节介绍与 CPU 和内存亲和性相关的 NVML 操作。
定义
- #define NVML_AFFINITY_SCOPE_NODE 0
- NUMA 节点亲和性查询的范围。
- #define NVML_AFFINITY_SCOPE_SOCKET 1
- 处理器插槽亲和性查询的范围。
函数
- nvmlReturn_t nvmlDeviceClearCpuAffinity ( nvmlDevice_t device )
- nvmlReturn_t nvmlDeviceGetCpuAffinity ( nvmlDevice_t device, unsigned int cpuSetSize, unsignedlong* cpuSet )
- nvmlReturn_t nvmlDeviceGetCpuAffinityWithinScope ( nvmlDevice_t device, unsigned int cpuSetSize, unsignedlong* cpuSet, nvmlAffinityScope_t scope )
- nvmlReturn_t nvmlDeviceGetMemoryAffinity ( nvmlDevice_t device, unsigned int nodeSetSize, unsignedlong* nodeSet, nvmlAffinityScope_t scope )
- nvmlReturn_t nvmlDeviceGetNumaNodeId ( nvmlDevice_t device, unsigned int* node )
- nvmlReturn_t nvmlDeviceSetCpuAffinity ( nvmlDevice_t device )
函数
- nvmlReturn_t nvmlDeviceClearCpuAffinity ( nvmlDevice_t device )
-
参数
- device
- 目标设备的标识符
返回值
- NVML_SUCCESS 如果调用进程已成功解除绑定
- NVML_ERROR_INVALID_ARGUMENT 如果 device 无效
- NVML_ERROR_UNINITIALIZED 如果库未成功初始化
- NVML_ERROR_UNKNOWN 如果发生任何意外错误
描述
清除调用线程的所有亲和性绑定。请注意,这是版本 8.0 的一项更改,因为旧版本会清除调用进程及其所有子进程的亲和性。
适用于 Kepler 或更新的完全支持的设备。仅在 Linux 上支持。
- nvmlReturn_t nvmlDeviceGetCpuAffinity ( nvmlDevice_t device, unsigned int cpuSetSize, unsignedlong* cpuSet )
-
参数
- device
- 目标设备的标识符
- cpuSetSize
- cpuSet 数组的安全访问大小
- cpuSet
- 数组引用,用于返回 CPU 的位掩码,64 位机器上每个 unsigned long 为 64 个 CPU,32 位机器上为 32 个 CPU
返回值
- NVML_SUCCESS 如果 cpuAffinity 已填充
- NVML_ERROR_UNINITIALIZED 如果库未成功初始化
- NVML_ERROR_INVALID_ARGUMENT 如果 device 无效,cpuSetSize == 0,或者 cpuSet 为 NULL
- NVML_ERROR_NOT_SUPPORTED 如果设备不支持此功能
- NVML_ERROR_GPU_IS_LOST 如果目标 GPU 已从总线上脱落或无法访问
- NVML_ERROR_UNKNOWN 如果发生任何意外错误
描述
检索一个 unsigned int 数组(大小为 cpuSetSize),其中包含设备的理想 CPU 亲和性的位掩码。例如,如果处理器 0、1、32 和 33 对于设备是理想的,并且 cpuSetSize == 2,则 result[0] = 0x3,result[1] = 0x3。这等效于使用 NVML_AFFINITY_SCOPE_NODE 调用 nvmlDeviceGetCpuAffinityWithinScope。
适用于 Kepler 或更新的完全支持的设备。仅在 Linux 上支持。
- nvmlReturn_t nvmlDeviceGetCpuAffinityWithinScope ( nvmlDevice_t device, unsigned int cpuSetSize, unsignedlong* cpuSet, nvmlAffinityScope_t scope )
-
参数
- device
- 目标设备的标识符
- cpuSetSize
- cpuSet 数组的安全访问大小
- cpuSet
- 数组引用,用于返回 CPU 的位掩码,64 位机器上每个 unsigned long 为 64 个 CPU,32 位机器上为 32 个 CPU
- scope
- 更改默认行为的范围
返回值
- NVML_SUCCESS 如果 cpuAffinity 已填充
- NVML_ERROR_UNINITIALIZED 如果库未成功初始化
- NVML_ERROR_INVALID_ARGUMENT 如果 device 无效,cpuSetSize == 0,cpuSet 为 NULL 或 scope 无效
- NVML_ERROR_NOT_SUPPORTED 如果设备不支持此功能
- NVML_ERROR_GPU_IS_LOST 如果目标 GPU 已从总线上脱落或无法访问
- NVML_ERROR_UNKNOWN 如果发生任何意外错误
描述
检索一个 unsigned int 数组(大小为 cpuSetSize),其中包含设备在节点或插槽内的理想 CPU 亲和性的位掩码。例如,如果处理器 0、1、32 和 33 对于设备是理想的,并且 cpuSetSize == 2,则 result[0] = 0x3,result[1] = 0x3
注意如果请求的范围不适用于目标拓扑,API 将回退到报告设备直接的非 I/O 祖先的 CPU 亲和性。
适用于 Kepler 或更新的完全支持的设备。仅在 Linux 上支持。
- nvmlReturn_t nvmlDeviceGetMemoryAffinity ( nvmlDevice_t device, unsigned int nodeSetSize, unsignedlong* nodeSet, nvmlAffinityScope_t scope )
-
参数
- device
- 目标设备的标识符
- nodeSetSize
- nodeSet 数组的安全访问大小
- nodeSet
- 数组引用,用于返回 NODE 的位掩码,64 位机器上每个 unsigned long 为 64 个 NODE,32 位机器上为 32 个 NODE
- scope
- 更改默认行为的范围
返回值
- NVML_SUCCESS 如果 NUMA 节点亲和性已填充
- NVML_ERROR_UNINITIALIZED 如果库未成功初始化
- NVML_ERROR_INVALID_ARGUMENT 如果 device 无效,nodeSetSize == 0,nodeSet 为 NULL 或 scope 无效
- NVML_ERROR_NOT_SUPPORTED 如果设备不支持此功能
- NVML_ERROR_GPU_IS_LOST 如果目标 GPU 已从总线上脱落或无法访问
- NVML_ERROR_UNKNOWN 如果发生任何意外错误
描述
检索一个 unsigned int 数组(大小为 nodeSetSize),其中包含设备在节点或插槽内的理想内存亲和性的位掩码。例如,如果 NUMA 节点 0、1 在插槽内对于设备是理想的,并且 nodeSetSize == 1,则 result[0] = 0x3
注意如果请求的范围不适用于目标拓扑,API 将回退到报告设备直接的非 I/O 祖先的内存亲和性。
适用于 Kepler 或更新的完全支持的设备。仅在 Linux 上支持。
- nvmlReturn_t nvmlDeviceGetNumaNodeId ( nvmlDevice_t device, unsigned int* node )
-
参数
- device
- 设备句柄
- node
- 设备的 NUMA 节点 ID
返回值
- NVML_SUCCESS 如果成功检索到 NUMA 节点
- NVML_ERROR_NOT_SUPPORTED 如果当前平台不支持请求
- NVML_ERROR_INVALID_ARGUMENT 如果设备节点无效
描述
获取给定 GPU 设备的 NUMA 节点。这仅适用于 GPU 是 NUMA 节点的平台。
- nvmlReturn_t nvmlDeviceSetCpuAffinity ( nvmlDevice_t device )
-
参数
- device
- 目标设备的标识符
返回值
- NVML_SUCCESS 如果调用进程已成功绑定
- NVML_ERROR_UNINITIALIZED 如果库未成功初始化
- NVML_ERROR_INVALID_ARGUMENT 如果 device 无效
- NVML_ERROR_NOT_SUPPORTED 如果设备不支持此功能
- NVML_ERROR_GPU_IS_LOST 如果目标 GPU 已从总线上脱落或无法访问
- NVML_ERROR_UNKNOWN 如果发生任何意外错误
描述
使用 nvmlDeviceGetCpuAffinity() 中给出的指南,为调用线程和设备设置理想的亲和性。请注意,这是版本 8.0 的一项更改。旧版本会为调用进程及其所有子进程设置亲和性。目前最多支持 1024 个处理器。
适用于 Kepler 或更新的完全支持的设备。仅在 Linux 上支持。