当前位置: 首页 > news >正文

nccl 源码分析 从 ncclAllReduce 的执行开始认识nccl源代码


文字没有提及的代码内容,不需要太在意,当然也可以瞟两眼;

首先,总体而言函数 ncclAllReduce 的功能在于将携带了一个操作的info结构体,放入了队列中,待后面执行;


排队的函数调用是 ncclEnqueueCheck(&info),在 ncclAllReduce函数体中被调用。


其他几个类似机制的 api 是

ncclAllGather
ncclAllReduce
ncclBroadcast
ncclBcast
ncclReduce
ncclReduceScatter
ncclSend
ncclRecv


他们都在文件 nccl/src/collectives.cc 中定义;


那么,稍微深入一下函数  ncclResult_t ncclEnqueueCheck(struct ncclInfo* info)
它调用了   NCCLCHECKGOTO(taskAppend(info->comm, info), ret, fail)
                而taskAppend() 又调用了两个函数:
                      hostToDevRedOp() 将reduce的ncclSum操作,转换成dev的ncclDevSum操作,然后调用了
                      ncclIntruQueueEnqueue(&tasks->collQueue, t); 将这个任务放入了comm的任务队列中。

那么需要看一下 ncclIntruQueueEnqueue 到底对t中的 t->op做了什么解析,t->op是这个函数的第二个参数的op成员;

ncclIntruQueueEnqueue() 仅仅是将 第二个参数t插入了一个链表info->comm->tasks中;
这个info是在ncclAllReduce()中定义的  struct ncclInfo info,其中info->comm 是ncclAllReduce 传递进来的第五个参数 ncclComm* comm。

综上所述,ncclAllReduce 仅仅是将一个 reduce 的任务插入到了 comm 的 tasks 链表中而已,并没有涉及到调用任何的 cuda 函数。

所以,启动相关的阿cuda kernel等,应该是在后面的 ncclGroupEnd() 中,通过解析 comm->tasks的数据元素来启动的。

接下来看一下 ncclGroupEnd() 的实现。

http://www.lryc.cn/news/272928.html

相关文章:

  • 仿照AirDrop(隔空投送)优雅地在局域网中传输文件
  • 【PHP】TP5.0及Fastadmin中将查询数据返回对象转为数组
  • 大公司里怎样开发和部署前端代码?
  • API接口:原理、设计与实践
  • 2023年TIOBE指数TOP50的编程语言写“Hello World!”
  • spring、springmvc、springboot、springcloud简介
  • 立仪科技光谱共焦位移传感器:应用领域的广泛性
  • neo4j图数据库安装和测试
  • 爬取豆瓣电影top250的电影名称(完整代码与解释)
  • tidb 集成 flyway 报错 denied to user for table global_variables
  • 很实用的ChatGPT网站—在线编程模块增补篇
  • A股风格因子看板 (2024.01第01期)
  • 基于gamma矫正的照片亮度调整(python和opencv实现)
  • LeetCode-Java(29)
  • 腾讯云导入导出镜像官方文档
  • keras 深度学习框架实现 手写数字识别
  • SELinux策略语法以及示例策略
  • 电路笔记 :自激振荡电路笔记 电弧打火机
  • prometheus grafana linux服务器监控
  • 有哪些有用的工作技巧?
  • k8s的网络类型
  • 《元宇宙2086》团队发布AI创作的元宇宙之歌
  • 【数据结构】数组实现队列(详细版)
  • Sharding-JDBC快速使用【笔记】
  • 总结MySQL 的一些知识点:MySQL 排序
  • Linux中经常使用的相关命令
  • 2022-2023年度广东省职业院校学生专业技能大赛“软件测试”赛项性能测试题目-Jmeter
  • R304S 指纹识别模块的硬件接口说明
  • postman使用-05新建测试集
  • oracle 子查询和窗口函数