我想在 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
但我预计会更像这样:参考
难道我做错了什么 ?这是正确的结果吗?
(旁注,我在 nvcr.io/nvidia/tensorrt:20.12-py3 docker 中运行此示例)