首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于NCCL程序的NVProf

用于NCCL程序的NVProf
EN

Stack Overflow用户
提问于 2021-05-27 02:06:24
回答 1查看 88关注 0票数 0

当我想使用NVProf来解决带有--metrics all的NCCL问题时,分析结果总是返回如下

代码语言:javascript
运行
复制
==2781== NVPROF is profiling process 2781, command: ./nccl_example 2 16
==2781== Profiling application: ./nccl_example 2 16
==2781== Profiling result:

未分析任何事件/指标。我的简单nccl程序

代码语言:javascript
运行
复制
#include <stdio.h>
#include "cuda_runtime.h"
#include "nccl.h"

int main(int argc, char* argv[])
{
  ncclComm_t comms[4];


  // managing 4 devices
  int nDev = 3;
  int size = 32*1024*1024;
  int devs[4] = {0, 1, 2};

  //allocating and initializing device buffers
  float** sendbuff = (float**)malloc(nDev * sizeof(float*));
  float** recvbuff = (float**)malloc(nDev * sizeof(float*));
  cudaStream_t* s = (cudaStream_t*)malloc(sizeof(cudaStream_t)*nDev);


  for (int i = 0; i < nDev; ++i) {
    CUDACHECK(cudaSetDevice(i));
    CUDACHECK(cudaMalloc(sendbuff + i, size * sizeof(float)));
    CUDACHECK(cudaMalloc(recvbuff + i, size * sizeof(float)));
    CUDACHECK(cudaMemset(sendbuff[i], 1, size * sizeof(float)));
    CUDACHECK(cudaMemset(recvbuff[i], 0, size * sizeof(float)));
    CUDACHECK(cudaStreamCreate(s+i));
  }


  //initializing NCCL
  NCCLCHECK(ncclCommInitAll(comms, nDev, devs));

   //calling NCCL communication API. Group API is required when using
   //multiple devices per thread
  NCCLCHECK(ncclGroupStart());
  for (int i = 0; i < nDev; ++i)
    NCCLCHECK(ncclAllReduce((const void*)sendbuff[i], (void*)recvbuff[i], 
                                size, ncclFloat, ncclSum, comms[i], s[i]));
  NCCLCHECK(ncclGroupEnd());


  //synchronizing on CUDA streams to wait for completion of NCCL operation
  for (int i = 0; i < nDev; ++i) {
    CUDACHECK(cudaSetDevice(i));
    CUDACHECK(cudaStreamSynchronize(s[i]));
  }


  //free device buffers
  for (int i = 0; i < nDev; ++i) {
    CUDACHECK(cudaSetDevice(i));
    CUDACHECK(cudaFree(sendbuff[i]));
    CUDACHECK(cudaFree(recvbuff[i]));
  }


  //finalizing NCCL
  for(int i = 0; i < nDev; ++i)
      ncclCommDestroy(comms[i]);

  printf("Success \n");
  return 0;
}

因为我需要了解NCCL API的详细指标,以便更深入地了解其性能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-27 02:57:11

这种行为是意料之中的。

默认情况下收集的events, metrics,与CUDA设备代码活动有关。要查看一些可能有指导意义的内容,请尝试使用--print-gpu-trace开关进行分析(并删除--metrics all)。

documented的“指标”不适用于NCCL正在进行的操作(数据复制)。它们适用于CUDA内核(即CUDA设备代码活动)。

nvprof似乎确实有可以为NVLink活动收集的指标。要查看这些内容,请在适用的系统(例如,具有NVLink)上运行以下命令:

代码语言:javascript
运行
复制
nvprof --query-metrics

代码语言:javascript
运行
复制
nvprof --query-metrics |grep -i nvlink
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67710465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档