nsys 配置多个进程

nsys profile multiple processes

我想在 Nvidia GPU 上试验 MPS,因此我希望能够并行分析两个进程 运行。 对于现已弃用的 nvprof,曾经有一个选项“--profile-all-processes”。 nsys 是否有等效项?

我尝试使用 MPS OFF 生成多个报告,然后他们使用此代码(来自 )在同一时间线上导入它们:

#include <stdio.h>
#include <stdlib.h>

#define MAX_DELAY 30

#define cudaCheckErrors(msg) \
  do { \
    cudaError_t __err = cudaGetLastError(); \
    if (__err != cudaSuccess) { \
        fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
            msg, cudaGetErrorString(__err), \
            __FILE__, __LINE__); \
        fprintf(stderr, "*** FAILED - ABORTING\n"); \
        exit(1); \
    } \
  } while (0)


#include <time.h>
#include <sys/time.h>
#define USECPSEC 1000000ULL

unsigned long long dtime_usec(unsigned long long start){

  timeval tv;
  gettimeofday(&tv, 0);
  return ((tv.tv_sec*USECPSEC)+tv.tv_usec)-start;
}

#define APPRX_CLKS_PER_SEC 1000000000ULL
__global__ void delay_kernel(unsigned seconds){

  unsigned long long dt = clock64();
  while (clock64() < (dt + (seconds*APPRX_CLKS_PER_SEC)));
}

int main(int argc, char *argv[]){
  cudaSetDevice(0);
  unsigned delay_t = 10; // seconds, approximately
  unsigned delay_t_r;
  if (argc > 1) delay_t_r = atoi(argv[1]);
  if ((delay_t_r > 0) && (delay_t_r < MAX_DELAY)) delay_t = delay_t_r;
  unsigned long long difft = dtime_usec(0);
  for (int i = 0; i < 3;i++) {
    delay_kernel<<<1,1>>>(delay_t);
    cudaDeviceSynchronize();
  }
  cudaCheckErrors("kernel fail");
  difft = dtime_usec(difft);
  printf("kernel duration: %fs\n", difft/(float)USECPSEC);
  cudaFree(0);
  return 0;
}

还有这个脚本:

nvcc -o t1034 t1034.cu

nsys profile -o rep1 -w true -t cuda,nvtx,osrt,cudnn,cublas -s none -f true -x true ./t1034 &
nsys profile -o rep2 -w true -t cuda,nvtx,osrt,cudnn,cublas -s none -f true -x true ./t1034

然后我打开 rep1.qdrep 并向其中添加 rep2.qdrep,从而生成以下时间轴:Nsys Timeline

但我期待更多这样的事情:Reference

我做错了什么吗?这是正确的结果吗?

(旁注,我在 nvcr 中 运行 这个例子。io/nvidia/tensorrt:20.12-py3 docker)

我想你的问题是为什么来自不同进程的内核看起来重叠,即使 MPS 已关闭。

这是由于低级别 GPU task/context 调度程序(行为)造成的。

过去,调度程序会 运行 一个 kernel/process/context/task 完成,然后从等待 process/context/task 调度另一个内核。在这种情况下,探查器将描述内核执行而不会重叠。

最近(假设是在 2015 年创建参考演示文稿后的某个时间),GPU 调度程序在各种较新的 GPU 和较新的 CUDA 版本上切换为时间切片。这意味着在较高级别上,即使 MPS 已关闭,任务似乎 运行ning 从分析器的角度来看是“同时”进行的。进程 1 中的内核 A 不一定被允许 运行 完成,在上下文调度程序暂停该内核之前,进行上下文切换,并允许进程 2 中的内核 B 开始执行一个时间片。

这对于普通内核的一个副作用是,由于时间片,那些似乎同时 运行ning 的内核通常需要更长的时间才能 运行。对于你的时间延迟内核,时间延迟机制被时间切片“愚弄”(有效地 SM 时钟继续递增)所以它们似乎不再需要 运行 时间,即使分时分享进行中

(即您已链接的那个)有类似的描述。