NVSHMEM 初始化#
本节介绍在使用 NVSHMEM 运行时开发应用程序时,一些关键的 NVSHMEM 初始化注意事项。
两阶段初始化#
此方法允许用户在调用 nvshmem_init
、nvshmemx_init_attr
或 nvshmemx_hostlib_init_attr
NVSHMEM 初始化 API 后选择 CUDA 设备。当应用程序想要基于从 nvshmem_my_pe
返回的 PE 分配 CUDA 设备时,可以使用此方法,并且此 API 只能在调用 nvshmem_init
或 nvshmemx_init_attr
API 后调用。以下是正确用法的示例
nvshmemx_init_attr(..., &attr);
// predefined_team can either NVSHMEM_TEAM_WORLD or NVSHMEMX_TEAM_NODE
int mype = [nvshmem_my_pe(), nvshmem_n_pes(), nvshmem_team_my_pe([predefined_team]];
cudaSetDevice(mype);
nvshmem(x)_*(...)
在两阶段初始化中,实际的初始化被延迟到设置设备后的第一次调用。在 NVSHMEM 初始化 API 返回后,只有少数几个 API(上面示例中列出)可以在不尝试重新初始化库的情况下调用。库会在任何主机和流上集合 API 中尝试重新初始化 NVSHMEM,例如 nvshmem_malloc
、nvshmem_calloc
、nvshmem_align
、nvshmem_barrier_all
、nvshmem_sync_all
、nvshmem_barrier_all_on_stream
或 nvshmem_sync_all_on_stream
。我们建议您仅在 NVSHMEM 初始化完成后才调用任何其他 API。要了解 NVSHMEM 初始化的状态,应用程序可以使用 nvshmemx_init_status。