创建资源【免费下载链接】hcommHCOMMHuawei Communication是HCCL的通信基础库提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm通信资源计算通信算子在执行时依赖底层的硬件通信资源因此在算子任务编排下发前首先需要申请所需的通信资源。HCCL通信资源主要分为三类Thread用于表达单个rank内的并发关系相同Thread上的task严格顺序执行不同Thread上的task可以并发执行。无论何种展开模式Thread均可分为1个主Thread和若干个从Thread由该主Thread来控制这些从Thread上的任务的开始和结束其中主Thread必须申请从Thread的申请数量由每个通信算法单独计算。Notify用于实现同步机制包括rank内Thread间同步和rank间同步。Channel用于跨rank传输数据的通道。不同的通信算法所需的通信资源数量往往不相同。下面以单机4卡的拓扑组网、使用AI CPU通信引擎为例分别讲解Ring环状通信算法、Mesh全连接通信算法所需通信资源数量的计算逻辑。Ring环状通信算法Ring算法的硬件拓扑如下图所示每个rank从上一个rank接收数据同时将数据发送到下一个rank。上述组网中Ring环状通信算法所需要的通信资源数量如下Thread每个rank分别跟左右两个rank进行通信且左右两端通信可以异步执行因此每个rank需要2个Thread资源。Thread NotifyThread上的Notify用于Thread之间的同步 对于1个Thread来说只需要1个Notify来接受另1个Thread的POST信号因此2个Thread只需要1个Notify。Channel每个rank分别跟左右两个rank进行通信因此每个rank需要建立2条Channel通信链路。Channel Notify每个rank分别跟左右两个rank进行同步同步操作分为Record和Wait二者需要配对使用因此每个Channel上需要2个Notify资源每个rank的2条Channel上共需要4个Notify资源。Mesh全连接通信算法Mesh算法的硬件拓扑如下图所示每个rank与其他所有rank直接通信。上述组网中Mesh全连接通信算法所需要的通信资源数量如下Thread每个rank跟其他所有rank进行通信且所有通信可以异步执行因此每个rank一共需要3个Thread资源。Thread NotifyThread上的Notify用于Thread之间的同步 对于1个Thread来说他只需要1个Notify来接受另1个Thread的POST信号因此3个Thread只需要2个Notify。Channel每个rank跟其他所有rank进行通信因此每个rank一共需要建立3条Channel通信通道。Channel Notify每个rank跟其他所有rank进行同步同步操作分为前同步和后同步前同步即是告诉远端rank自己已经准备好数据或者内存可被远端Rank读写后同步即是告诉远端Rank自己已经读写完毕二者需要配对使用因此每个rank各3条Channel一共需要6个Notify资源。综上所述针对Ring环状通信算法、Mesh全连接通信算法每个rank所需的通信资源数量如下表所示。单机4卡拓扑中算法所需各类通信资源的数量对比如下表所示。通信资源Ring算法Mesh算法Thread23Notify46Channel23代码示例下面以自定义点对点Send/Receive通信算子为例介绍其在Host上的资源创建代码片段。申请Context内存用以存储资源信息uint64_t size 需要申请的Context内存的大小; void *ctx nullptr; char *tag 保存资源需要用到的tag; CommEngine engine COMM_ENGINE_AICPU_TS; // 选择引擎 HcclResult ret HcclEngineCtxGet(comm, tag, engine, ctx, size); if (ret ! HCCL_SUCCESS) { // 即之前没有创建过tag表示的资源 HcclEngineCtxCreate(comm, tag, engine, size, ctx); }else { // 说明之前创建过资源直接用ctx就好 }申请Thread资源。CommEngine engine CommEngine::COMM_ENGINE_AICPU; // AI CPU通信引擎 uint32_t threadNum 1; // 申请一个通信线程 uint32_t notifyNumPerThread 0; // 因为仅一个通信线程不涉及线程间同步所以不额外申请通信线程中的同步资源 ThreadHandle thread; HcclThreadAcquire(comm, engine, threadNum, notifyNumPerThread, thread); // 将thread句柄保存进ctx指向的内存中方便后续使用建立通信链路Channel两个rank之间建立1条通信通道。HcclChannelDesc channelDesc; HcclChannelDescInit(channelDesc, 1); channelDesc.remoteRank destRank; channelDesc.channelProtocol CommProtocol::COMM_PROTOCOL_HCCS; channelDesc.notifyNum 2; // 前同步和后同步均需要notify因此需要2个notify ChannelHandle channelHandle; HcclChannelAcquire(comm, engine, channelDesc, 1, channelHandle); // 将channel句柄保存进ctx指向的内存中方便后续使用分配通信内存。// 分配并获取本端通信内存 void *localAddr; uint64_t localSize; HcclGetHcclBuffer(comm, localAddr, localSize); // 获取远端通信内存用于后续读写操作 void *remoteAddr; uint64_t remoteSize; HcclChannelGetHcclBuffer(comm, channelHandle, remoteAddr, remoteSize); // 将内存地址保存进ctx指向的内存中方便后续使用【免费下载链接】hcommHCOMMHuawei Communication是HCCL的通信基础库提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考