ncclComm
结构体是 NCCL(NVIDIA Collective Communications Library)中的一个核心数据结构,用于表示一个通信器(communicator)。通信器是 NCCL 中进行多 GPU 通信的基本单位。这个结构体包含了用于管理通信、设备信息、内存分配、算法选择等的各种字段。下面是每个字段的解释,以及它们在不同模块和流程中的应用:
-
startMagic:
- 类型:
uint64_t
- 描述:用于识别通信器的起始标志,以确保通信器的初始化是正确的。
- 模块/流程:主要用于初始化和验证通信器的完整性。
- 类型:
-
memPermanent, memScoped:
- 类型:
ncclMemoryStack
- 描述:两个内存栈,
memPermanent
用于持久内存分配,memScoped
用于有范围的(scoped)内存分配。 - 模块/流程:内存管理,用于动态内存分配和释放。
- 类型:
-
destructorHead:
- 类型:
ncclDestructor*
- 描述:用于存储在通信器析构时需要调用的析构函数的链表头。
- 模块/流程:资源管理,确保在通信器销毁时正确释放资源。
- 类型:
-
sharedRes:
- 类型:
ncclSharedResources*
- 描述:指向共享资源的指针,例如跨通信器共享的网络资源。
- 模块/流程:资源共享,多个通信器之间共享的资源管理。
- 类型:
-
topParentRanks, topParentLocalRanks:
- 类型:
int*
- 描述:用于存储在拓扑结构中,当前节点的顶层父节点的排名和本地排名。
- 模块/流程:拓扑结构管理,用于优化通信路径。
- 类型:
-
channels[MAXCHANNELS]:
- 类型:
ncclChannel[]
- 描述:存储通信通道,每个通道用于并行的数据传输。
- 模块/流程:通信管理,处理并行化通信。
- 类型:
-
peerInfo:
- 类型:
ncclPeerInfo*
- 描述:存储有关其他通信器的信息,如设备和网络信息。
- 模块/流程:通信初始化,用于建立与其他通信器的连接。
- 类型:
-
topo:
- 类型:
ncclTopoSystem*
- 描述:存储拓扑结构信息,用于确定最佳通信路径。
- 模块/流程:拓扑管理和优化。
- 类型:
-
netPluginLoaded, ncclNet, netDeviceType, ncclCollNet:
- 类型:
int
,ncclNet_t*
,ncclNetDeviceType
,ncclCollNet_t*
- 描述:与网络插件和设备类型相关的字段,用于配置和加载网络通信插件。
- 模块/流程:网络通信模块,用于支持各种网络设备。
- 类型:
-
bootstrap:
- 类型:
void*
- 描述:用于初始化通信器的引导信息。
- 模块/流程:初始化,用于通信器的创建。
- 类型:
-
connectSend, connectRecv:
- 类型:
uint64_t*
- 描述:位掩码,用于设置点对点通信中的发送和接收连接。
- 模块/流程:连接管理,处理点对点通信的连接设置。
- 类型:
-
graphs[NCCL_NUM_ALGORITHMS]:
- 类型:
ncclTopoGraph[]
- 描述:存储用于不同算法的拓扑图。
- 模块/流程:算法选择和优化,确定最佳通信路径。
- 类型:
-
initAlgoChannels, runtimeConn:
- 类型:
bool[]
,bool
- 描述:用于标识算法通道的初始化状态和动态连接支持。
- 模块/流程:算法选择,通信动态配置。
- 类型:
-
cuMemSupport:
- 类型:
int
- 描述:标识是否支持 cuMem API。
- 模块/流程:内存管理,与 CUDA 内存管理 API 相关。
- 类型:
-
magic:
- 类型:
uint64_t
- 描述:网络通信的魔术数,用于检测通信中的不匹配。
- 模块/流程:通信验证,用于确保通信的正确性。
- 类型:
-
commHash:
- 类型:
uint64_t
- 描述:通信器的哈希值,用于唯一标识通信器。
- 模块/流程:标识管理,用于验证通信器。
- 类型:
-
rank, nRanks, cudaDev, nvmlDev:
- 类型:
int
- 描述:存储通信器中的排名、总 GPU 数量、CUDA 设备索引和 NVML 设备索引。
- 模块/流程:设备管理,跟踪和管理通信器中的设备。
- 类型:
-
compCap, minCompCap, maxCompCap:
- 类型:
int
- 描述:存储 GPU 的计算能力,以及通信器中的最小和最大计算能力。
- 模块/流程:设备能力管理,用于确保兼容性。
- 类型:
-
busId:
- 类型:
int64_t
- 描述:存储 GPU 的 PCI 总线 ID。
- 模块/流程:设备识别和通信路径选择。
- 类型:
-
cpuAffinity:
- 类型:
cpu_set_t
- 描述:存储 GPU 的 CPU 亲和性。
- 模块/流程:资源分配,用于优化 CPU 和 GPU 之间的数据传输。
- 类型:
-
cudaArch:
- 类型:
int
- 描述:存储 CUDA 设备的架构版本。
- 模块/流程:设备管理,确保代码与 GPU 架构兼容。
- 类型:
-
cpuArch, cpuVendor:
- 类型:
int
- 描述:存储 CPU 的架构和供应商信息。
- 模块/流程:设备管理,用于优化 CPU-GPU 协同工作。
- 类型:
-
node, nNodes, localRank, localRanks, maxLocalRanks:
- 类型:
int
- 描述:与节点和本地排名相关的字段。
- 模块/流程:集群管理,跟踪和管理多节点、多 GPU 环境。
- 类型:
-
rankToNode, rankToLocalRank, localRankToRank:
- 类型:
int*
- 描述:用于在不同节点和本地排名之间进行映射。
- 模块/流程:拓扑管理,优化跨节点通信。
- 类型:
-
nodeRanks:
- 类型:
ncclNodeRanks*
- 描述:存储每个节点的排名信息。
- 模块/流程:集群管理,用于优化多节点通信。
- 类型:
-
MNNVL, clique, cliqueRank:
- 类型:
int
,cliqueInfo
,int
- 描述:与多节点 NVLink (MNNVL) 支持相关的字段。
- 模块/流程:通信优化,特别是在多节点、多 GPU 环境中。
- 类型:
-
checkPointers, dmaBufSupport:
- 类型:
bool
- 描述:用于指针检查和 DMA 缓冲区支持。
- 模块/流程:内存管理,确保数据传输的安全性和高效性。
- 类型:
-
opCount:
- 类型:
uint64_t
- 描述:用于跟踪 CUDA 启动的操作计数。
- 模块/流程:性能跟踪,用于优化通信性能。
- 类型:
-
nChannels, collChannels, nvlsChannels:
- 类型:
int
- 描述:存储通信和 NVLS 通道的数量。
- 模块/流程:通道管理,优化数据传输。
- 类型:
-
nvlsHeads:
- 类型:
int[MAXCHANNELS]
- 描述:存储 NVLS 的头信息,用于判断是否可以拆分共享。
- 模块/流程:通信优化,特别是在使用 NVLink 时。
- 类型:
-
p2pnChannels, p2pnChannelsPerPeer:
- 类型:
int
- 描述:用于点对点通信的通道数量。
- 模块/流程:点对点通信,管理通道分配。
- 类型:
-
allocP2pNetLLBuffers:
- 类型:
bool
- 描述:指示是否为网络 P2P 连接分配 LL 缓冲区。
- 模块/流程:内存管理和通信优化。
- 类型:
-
buffSizes[NCCL_NUM_PROTOCOLS]:
- 类型:
int[]
- 描述:存储不同协议的缓冲区大小。
- 模块/流程:内存管理,优化不同协议的数据传输。
- 类型:
-
p2pChunkSize, nvlsChunkSize:
- 类型:
int
- 描述:存储 P2P 和 NVLS 的数据块大小。
- 模块/流程:数据传输,优化
- 类型:
数据块的大小以提高传输效率。
-
threadThresholds[NCCL_NUM_ALGORITHMS][NCCL_NUM_PROTOCOLS]:
- 类型:
ssize_t[][]
- 描述:存储不同算法和协议的线程阈值。
- 模块/流程:算法优化,选择最佳线程配置。
- 类型:
-
latencies[NCCL_NUM_FUNCTIONS][NCCL_NUM_ALGORITHMS][NCCL_NUM_PROTOCOLS], bandwidths[NCCL_NUM_FUNCTIONS][NCCL_NUM_ALGORITHMS][NCCL_NUM_PROTOCOLS], ringbdw[NCCL_NUM_FUNCTIONS][NCCL_NUM_PROTOCOLS]:
- 类型:
float[][][]
,float[][][]
,float[][]
- 描述:存储不同函数、算法和协议的延迟和带宽。
- 模块/流程:性能优化,选择最佳的通信配置。
- 类型:
-
maxThreads[NCCL_NUM_ALGORITHMS][NCCL_NUM_PROTOCOLS]:
- 类型:
int[][]
- 描述:存储不同算法和协议的最大线程数。
- 模块/流程:资源管理,确保线程数在合理范围内。
- 类型:
-
asyncResult:
- 类型:
ncclResult_t
- 描述:存储异步 NCCL 操作的返回结果。
- 模块/流程:错误处理,用于跟踪异步操作的状态。
- 类型:
-
abortFlag, abortFlagDev, abortFlagRefCount, childAbortFlag, childAbortFlagDev:
- 类型:
uint32_t*
,int*
- 描述:用于跟踪和控制 NCCL 内核的中止标志。
- 模块/流程:错误处理,确保在必要时正确中止操作。
- 类型:
-
destroyFlag:
- 类型:
uint32_t
- 描述:用于标识通信器是否已经销毁。
- 模块/流程:资源管理,防止重复销毁。
- 类型:
-
devComm:
- 类型:
ncclDevComm*
- 描述:指向设备侧通信器的指针。
- 模块/流程:设备管理,用于与 GPU 相关的资源管理。
- 类型:
-
workArgsBytes, workFifoBytes, workFifoBuf, workFifoBufDev, workFifoBufGdrHandle:
- 类型:
uint32_t
,void*
- 描述:与工作队列相关的字段,存储工作队列的大小和缓冲区指针。
- 模块/流程:任务调度,管理 CUDA 内核的工作队列。
- 类型:
-
workFifoConsumed, workFifoConsumedLeast, workFifoProduced:
- 类型:
uint32_t*
- 描述:用于跟踪工作队列的消耗和生产状态。
- 模块/流程:任务调度,确保工作队列的高效使用。
- 类型:
-
intraComm0, intraNext:
- 类型:
ncclComm*
- 描述:用于管理进程内的通信器链表。
- 模块/流程:进程内通信,优化同一进程内的通信。
- 类型:
-
intraRank, intraRanks, intraBarrierPhase, intraBarrierCounter, intraBarrierGate:
- 类型:
int
,uint64_t
- 描述:用于进程内的通信屏障和同步。
- 模块/流程:进程内通信,确保同步和屏障的正确性。
- 类型:
-
proxyState, proxyRefCountOld:
- 类型:
ncclProxyState*
,int
- 描述:用于管理代理状态和引用计数。
- 模块/流程:代理管理,处理代理资源。
- 类型:
-
collNetSupport, collNetRegSupport, collNetSupportMatrix:
- 类型:
int
,bool
,uint8_t[][]
- 描述:与 CollNet 支持相关的字段。
- 模块/流程:通信优化,支持 CollNet。
- 类型:
-
intraHighestTransportType:
- 类型:
int
- 描述:存储进程内最高的传输类型。
- 模块/流程:通信优化,用于选择最佳传输方式。
- 类型:
-
collNetHeads, collNetHeadsNum, collNetDenseToUserRank, collNetUserToDenseRank:
- 类型:
int*
- 描述:用于管理 CollNet 的头信息和排名映射。
- 模块/流程:通信优化,特别是在 CollNet 中。
- 类型:
-
collNetSharedRes:
- 类型:
ncclCollNetSharedRes*
- 描述:共享的 CollNet 代理进度资源。
- 模块/流程:资源共享,用于 CollNet 的优化。
- 类型:
-
nvlsSupport, nvlsRegSupport, nvlsResources:
- 类型:
int
,ncclNvlsSharedRes*
- 描述:与 NVLink SHARP(NVLS)支持相关的字段。
- 模块/流程:通信优化,支持 NVLS。
- 类型:
-
memPool_ncclProxyOp, memPool_ncclKernelPlan:
- 类型:
ncclMemoryPool
- 描述:用于管理 ncclProxyOp 和 ncclKernelPlan 的内存池。
- 模块/流程:内存管理,优化资源分配。
- 类型:
-
groupNext, preconnectNext, persistentRefs:
- 类型:
ncclComm*
,int
- 描述:用于管理通信器的组连接和持久引用。
- 模块/流程:通信优化,特别是在组通信中。
- 类型:
-
p2pSchedule:
- 类型:
P2pSchedulePair*
- 描述:存储点对点通信的调度信息。
- 模块/流程:调度管理,优化点对点通信的调度。
- 类型:
-
planner:
- 类型:
ncclKernelPlanner
- 描述:用于管理和计划 CUDA 内核的执行。
- 模块/流程:任务调度,确保内核执行的高效性。
- 类型:
-
userRedOpCapacity, userRedOpFreeHead, userRedOps:
- 类型:
int
,ncclUserRedOp*
- 描述:用户定义的 reduction 操作相关的字段。
- 模块/流程:自定义操作管理,支持用户定义的 reduction 操作。
- 类型:
-
callbackQueue:
- 类型:
ncclIntruQueueMpsc
- 描述:主线程的回调队列,用于处理异步操作的回调。
- 模块/流程:任务调度,确保异步操作的正确执行。
- 类型:
-
config:
- 类型:
ncclConfig_t
- 描述:通信器的配置。
- 模块/流程:配置管理,管理和存储通信器的配置。
- 类型:
-
initState:
- 类型:
ncclResult_t
- 描述:初始化状态,用于方便地在错误发生时回收资源。
- 模块/流程:错误处理,确保资源的正确回收。
- 类型:
-
finalizeCalled:
- 类型:
bool
- 描述:标识是否调用了 ncclCommFinalize()。
- 模块/流程:资源管理,确保资源的正确释放。
- 类型:
-
finalizeRankCnt:
- 类型:
int
- 描述:用于 finalization 的共享结构。
- 模块/流程:资源管理,特别是在多线程环境中。
- 类型:
-
groupJob:
- 类型:
ncclGroupJob*
- 描述:用于支持多线程的容错。
- 模块/流程:任务管理,特别是在多线程环境中。
- 类型:
-
tunerPluginLoaded, tuner, tunerContext:
- 类型:
int
,ncclTuner_t*
,void*
- 描述:与调优插件相关的字段。
- 模块/流程:性能调优,用于加载和管理调优插件。
- 类型:
-
regCache:
- 类型:
ncclRegCache
- 描述:缓冲区注册缓存,用于优化内存访问。
- 模块/流程:内存管理,特别是在高频访问的场景中。
- 类型:
-
endMagic:
- 类型:
uint64_t
- 描述:用于识别通信器的结束标志,以确保通信器的销毁是正确的。
- 模块/流程:资源管理,验证通信器的完整性。
- 类型:
综上所述,ncclComm
结构体涵盖了与 NCCL 通信器相关的各个方面,从内存管理、设备信息、通信通道、算法选择、错误处理到资源管理等各个模块。每个字段在不同的模块和流程中起到了至关重要的作用,确保了 NCCL 的高效和可靠运行。