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

NCCL如何打印XML拓扑文件,操作说明和源码展示

NCCL源码解读的视频在这:NCCL集合通信源码解读、案例、任务调度、拓扑_哔哩哔哩_bilibili

一、环境变量设置

1.1 命令行环境变量设置

为了打印XML拓扑文件,需要设置NCCL的环境变量NCCL_TOPO_DUMP_FILE。这个环境变量指定了XML拓扑文件的输出路径和文件名。例如,可以在命令行中设置此环境变量:

export NCCL_TOPO_DUMP_FILE=/path/to/output/topo.xml
1.2 代码中环境变量设置

或者,在代码中设置此环境变量(假设使用的是C/C++):

setenv("NCCL_TOPO_DUMP_FILE", "/path/to/output/topo.xml", 1);
#include <stdlib.h>
#include <nccl.h>

int main() {

    // 设置环境变量
    setenv("NCCL_TOPO_DUMP_FILE", "/path/to/output/topo.xml", 1);

 

    // 初始化NCCL通信器(这里以单GPU为例)
    ncclComm_t comm;
    int nDevices = 1;
    cudaSetDevice(0); // 设置CUDA设备
    ncclCommInitAll(comm, nDevices, NULL);


    // ... 进行其他NCCL操作 ...


    // 销毁NCCL通信器
    ncclCommDestroy(comm);

    return 0;
}

二、生成xml拓扑文件

按照1.1中的方法设置了环境变量,然后运行NCCL-tests,成功生成topo.xml文件

 

NCCL-tests的安装和使用教程请参考:

三、xml拓扑文件

<system version="1">
  <cpu numaid="0" affinity="0000,000fffff,ff000000,0fffffff" arch="x86_64" vendor="GenuineIntel" familyid="6" modelid="106">
    <pci busid="0000:31:00.0" class="0x030200" vendor="0x10de" device="0x1eb8" subsystem_vendor="0x10de" subsystem_device="0x12a2" link_speed="8 GT/s" link_width="16">
      <gpu dev="0" sm="75" rank="0" gdr="1"/>
    </pci>
    <nic>
      <net name="eth0" dev="0" speed="10000" port="0" latency="0.000000" guid="0x0" maxconn="65536" gdr="0"/>
    </nic>
  </cpu>
</system>

四、拓扑文件保存代码

1、如果设置了环境变量NCCL_TOPO_DUMP_FILE调用保存拓扑文件函数ncclTopoDumpXmlToFile

  xmlTopoFile = ncclGetEnv("NCCL_TOPO_DUMP_FILE");
  if (xmlTopoFile && comm->rank == ncclParamTopoDumpFileRank()) {
    INFO(NCCL_ENV, "NCCL_TOPO_DUMP_FILE set by environment to %s", xmlTopoFile);
    NCCLCHECK(ncclTopoDumpXmlToFile(xmlTopoFile, xml));
  }

2、ncclTopoDumpXmlToFile中打开文件,并调用ncclTopoDumpXmlRec向文件中写入内容

ncclResult_t ncclTopoDumpXmlToFile(const char* xmlTopoFile, struct ncclXml* xml) {
  FILE* file = fopen(xmlTopoFile, "w");
  if (file == NULL) {
    WARN("Unable to open %s, not dumping topology.", xmlTopoFile);
    return ncclSuccess;
  }
  NCCLCHECK(ncclTopoDumpXmlRec(0, file, xml->nodes));
  fclose(file);
  return ncclSuccess;
}

3、ncclTopoDumpXmlRec向文件中写入内容

ncclResult_t ncclTopoDumpXmlRec(int indent, FILE* file, struct ncclXmlNode* node) {
  for (int i=0; i<indent; i++) fprintf(file, " ");
  fprintf(file, "<%s", node->name);

  for (int a=0; a<node->nAttrs; a++) {
    fprintf(file, " %s=\"%s\"", node->attrs[a].key, node->attrs[a].value);
  }
  if (node->nSubs == 0) {
    fprintf(file, "/>\n");
  } else {
    fprintf(file, ">\n");
    for (int s=0; s<node->nSubs; s++) {
      NCCLCHECK(ncclTopoDumpXmlRec(indent+2, file, node->subs[s]));
    }
    for (int i=0; i<indent; i++) fprintf(file, " ");
    fprintf(file, "</%s>\n", node->name);
  }
  return ncclSuccess;
}

相关文章:

  • VIC水文模型
  • 打靶练习-W1R3S、JARBAS、SickOS、Prime
  • 【每日学点HarmonyOS Next知识】tab对齐、相对布局、自定义弹窗全屏、动画集合、回到桌面
  • 【Unity网络同步框架 - Nakama研究(二)】
  • 基于NXP+FPGA永磁同步电机牵引控制单元(单板结构/机箱结构)
  • Simulink指导手册笔记②--快捷键及基本操作
  • C51 Proteus仿真实验17:数码管显示4×4键盘矩阵按键
  • CesiumforUE中Cesium3DTileset中高频使用的组件概述
  • 【最新】 ubuntu24安装 1panel 保姆级教程
  • Flutter PopScope对于iOS设置canPop为false无效问题
  • 网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合
  • 用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件
  • 如何判断一个项目用的是哪个管理器
  • PhotoMill X for Mac v2.8.1 图片批量编辑工具 支持M、Intel芯片
  • TypeScript 高级类型 vs JavaScript:用“杂交水稻”理解类型编程
  • AWK 入门教程:强大的文本处理工具
  • 区块链知识点2
  • Blender学习方法与技巧
  • React19源码系列之FiberRoot节点和Fiber节点
  • Linux网络编程——UDP网络通信的简单实现
  • 字母哥动了离开的心思,他和雄鹿队的缘分早就到了头
  • 男子退机票被收票价90%的手续费,律师:虽然合规,但显失公平
  • 江西吉水通报一男子拒服兵役:不得考公,两年内经商、升学等受限
  • 中拉论坛第四届部长级会议将举行,外交部介绍情况
  • 中美会谈前都发生了什么?美方为何坐不住了?
  • 中美经贸高层会谈将在午餐后继续