首先需要明确的是,nccl中,会为每一个rank节点(我们通常所指的GPU)分配两个proxy线程,proxyService负责进程初始化时的create和init等操作,而proxyProgress线程负责实际的send以及recv。 本文中的部分图片来自互联网,在此不特别标注,侵权则删。 NVLS Tree中的多步操作如何转化为对应的send与recv NVLS save op ncclProxy...
调用computeBuffSizes计算通信需要分配的内存 调用ncclTopoComputeP2pChannels初始化p2p channels(内部调用initChannel进行channel初始化) 调用ncclProxyCreate创建代理线程,执行ncclProxyService/ServiceUDS 调用setupChannel将环写到ncclChannel.ring->userRanks中发布于 2024-12-02 00:19・北京 ...
1 : 0; } struct ncclTransport collNetTransport = { "COL", canConnect, { sendSetup, sendConnect, sendFree, NULL, sendProxySetup, sendProxyConnect, sendProxyFree, sendProxyProgress }, { recvSetup, recvConnect, recvFree, NULL, recvProxySetup, recvProxyConnect, recvProxyFree, recvProxyProgress ...
ncclInfo转化为ncclQueueElem 的同时会转化为一个ncclProxyOp (是eqElem的数据成员),ncclProxyOp 即是main thread和proxy progress线程交互的data,ncclProxyOp主要和info类似,不过会多一些loop、nstep算法相关的参数,所以扩充上面的图如下 输入info + compute data到enqueueInfo(include proxyOp) ...