NVPROF(和其他 CUDA 分析器)通过重播内核两次来计算 FLOPS。在一次通过中,该工具收集时间和 SM 经过的周期。在第二遍中,该工具修改内核以计算 FLOPS 总数。
SMCOUNT = CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT
flops_sp_efficiency = flop_count_sp / (elapsed_cycles_sm * SM_MAX_FLOP_PER_CYCLE)
SM_MAX_FLOP_PER_CYCLE = CUDA_CORES x 2 / SMCOUNT
flops = flop_count_sp / gpu__time_duration x NANOSECONDS_PER_SECOND
gpuclk_hz = elapsed_cycles_sm / SMCOUNT / gpu_time_duration x NANOSECONDS_PER_SECOND
elapsed_cycles_sm 是 SM 时钟域中经过的周期数,所有 SM 的总和。SM 时钟域与图形时钟相同。
NVPROF 既没有事件也没有持续时间的度量。可以使用跟踪活动在 NVPROF 中捕获持续时间。在 Perfworks 中,度量 gpu__time_duration 是内核的挂钟持续时间。
Nsight VSE CUDA Profiler 允许开发人员自定义每条指令的权重或使用 SASS 正则表达式定义全新的实验。请参阅https://docs.nvidia.com/nsight-visual-studio-edition/Nsight_Visual_Studio_Edition_User_Guide.htm#Analysis/Report/CudaExperiments/KernelLevel/AchievedFlops.htm
答案 1 - 是的,这些工具使用实时测量来确定理论最大值。这是在内核重放中计算的。
答案 2 - 每次执行内核都会收集指标。NVPROF(但不是其他工具)使用非加权平均值在具有相同函数名称的内核上汇总指标。