NVIDIA GPU atom.global指令Profing

embedded/2024/9/19 0:43:39/ 标签: CUDA, GPU, 性能分析, 性能优化, GPGPU

NVIDIA GPU atom.global指令Profing

  • 一.小结
  • 二.输出解释
  • 三.复现过程

本文对NVIDIA GPU atom.global指令Profing,并小结

一.小结

  • sm atom指令的执行能力为:112 inst/cycle,每条atom warp指令会产生32个request,即3584 request/cycle
  • lts有18个slice,每个slice处理能力为 1 request/cycle,总的处理能力为18 request/cycle
  • 如果每个sm同时发atom指令,最小需要等待 3584/18=199cycle
  • 如果落在同一个lts slice,延迟还会增加
  • 同样的atom指令条数,如果一半inc一半dec,总的cycle数比仅inc或dec小约一半,但lts的利用率无明显差异
  • 通过比较lts__t_requests_op_atom的sum和max,发现仅inc或dec只有一个lts slice参与,但inc和dec的组合,会用到2个lts slice

二.输出解释

# 28个sm,每个sm个sub_core,每个sub_core上运行1个warp(32线程),每个线程执行32次(atom inc+inc或inc+dec或dec+dec)
# 总的atomic warp请求数为=28*4*32*2=7168inc+inc:239121
inc+dec:121946  #同样的atom指令条数,如果一半inc一半dec,总的cycle数比仅inc或dec小约一半
dec+dec:240249atomic_kernel(float *, float *, int) (28, 1, 1)x(128, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
----------------------------------------------------------------- ------------- ------------
Metric Name                                                         Metric Unit Metric Value
----------------------------------------------------------------- ------------- ------------
lts__cycles_elapsed.avg.per_second                                          Ghz         1.24 #L2 Cache的频率
lts__d_atomic_input_cycles_active.sum                                     cycle      229,381 #--| # of cycles where the atomic unit's input was active
lts__t_requests_op_atom.max                                             request      229,376 #sum等于max 说是只有1个lts参与
lts__t_requests_op_atom.max.peak_sustained                        request/cycle            1 #每一个atomic unit的峰值性能
lts__t_requests_op_atom.min                                             request            0
lts__t_requests_op_atom.sum                                             request      229,381 #--| 等于atom warp指令数*32,即每个warp atom指令生成32个request
lts__t_requests_op_atom.sum.pct_of_peak_sustained_active                      %        84.51 # L2 atomic unit 利用率
lts__t_requests_op_atom.sum.peak_sustained                        request/cycle           18 # atomic unit总的峰值性能,也就是说有18个atomic unit
lts__t_sectors_op_atom.sum                                               sector      229,381 # 请求的sectors个数,跟request一样,说明并没有合并
lts__cycles_active.avg                                                    cycle       15,079
lts__cycles_active.max                                                    cycle      231,455 #--|
lts__cycles_active.min                                                    cycle        1,297 #--| 最大值跟最小值有差距,说明各个lts单元负载不均衡
lts__cycles_active.sum                                                    cycle      271,422
smsp__inst_executed_op_generic_atom.avg                                    inst        64.04
smsp__inst_executed_op_generic_atom.max                                    inst           69
smsp__inst_executed_op_generic_atom.min                                    inst           64
smsp__inst_executed_op_generic_atom.sum                                    inst        7,173 #执行的指令条数比sass指令条数多,可能是指令replay导致的
sm__cycles_elapsed.avg.per_second                                           Ghz         1.32 #sm的频率(比lts高)
smsp__cycles_elapsed.avg.per_second                                         Ghz         1.32
smsp__sass_data_bytes_mem_global_op_atom.sum                              Kbyte        28.67 #warp sass指令条数*sizeof(int)
smsp__sass_inst_executed_op_atom.sum                                       inst        7,168 #warp sass指令条数
smsp__sass_inst_executed_op_atom.sum.pct_of_peak_sustained_active             %         0.03 #smsp atom单元的峰值占比(smsp__sass_inst_executed_op_atom.sum/smsp__cycles_active/peak)#因为存在启动开销smsp__cycles_active远大于atom指令发射的cycle数,所以利用率不高
smsp__sass_inst_executed_op_atom.sum.peak_sustained                  inst/cycle          112 #sub_core atom指令能力:每个sub_core每个cycle处理一条atom warp指令(28sm*4subcore)
smsp__sass_inst_executed_op_global_atom.sum                                inst        7,168 
----------------------------------------------------------------- ------------- ------------atomic_kernel(float *, float *, int) (28, 1, 1)x(128, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
----------------------------------------------------------------- ------------- ------------
Metric Name                                                         Metric Unit Metric Value
----------------------------------------------------------------- ------------- ------------
lts__cycles_elapsed.avg.per_second                                          Ghz         1.24
lts__d_atomic_input_cycles_active.sum                                     cycle      229,381
lts__t_requests_op_atom.max                                             request      114,688 #sum是229381 max是114688 说是有2个lts参与
lts__t_requests_op_atom.max.peak_sustained                        request/cycle            1
lts__t_requests_op_atom.min                                             request            0
lts__t_requests_op_atom.sum                                             request      229,381
lts__t_requests_op_atom.sum.pct_of_peak_sustained_active                      %        83.98 #无明显差异
lts__t_requests_op_atom.sum.peak_sustained                        request/cycle           18
lts__t_sectors_op_atom.sum                                               sector      229,381
lts__cycles_active.avg                                                    cycle    15,173.78
lts__cycles_active.max                                                    cycle      117,755 #最大值比仅inc或dec要小,说明负载输相对均匀一些
lts__cycles_active.min                                                    cycle        1,391
lts__cycles_active.sum                                                    cycle      273,128
smsp__inst_executed_op_generic_atom.avg                                    inst        64.04
smsp__inst_executed_op_generic_atom.max                                    inst           69
smsp__inst_executed_op_generic_atom.min                                    inst           64
smsp__inst_executed_op_generic_atom.sum                                    inst        7,173
sm__cycles_elapsed.avg.per_second                                           Ghz         1.32
smsp__cycles_elapsed.avg.per_second                                         Ghz         1.32
smsp__sass_data_bytes_mem_global_op_atom.sum                              Kbyte        28.67
smsp__sass_inst_executed_op_atom.sum                                       inst        7,168
smsp__sass_inst_executed_op_atom.sum.pct_of_peak_sustained_active             %         0.05
smsp__sass_inst_executed_op_atom.sum.peak_sustained                  inst/cycle          112
smsp__sass_inst_executed_op_global_atom.sum                                inst        7,168
----------------------------------------------------------------- ------------- ------------atomic_kernel(float *, float *, int) (28, 1, 1)x(128, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
----------------------------------------------------------------- ------------- ------------
Metric Name                                                         Metric Unit Metric Value
----------------------------------------------------------------- ------------- ------------
lts__cycles_elapsed.avg.per_second                                          Ghz         1.24
lts__d_atomic_input_cycles_active.sum                                     cycle      229,381
lts__t_requests_op_atom.max                                             request      229,376
lts__t_requests_op_atom.max.peak_sustained                        request/cycle            1
lts__t_requests_op_atom.min                                             request            0
lts__t_requests_op_atom.sum                                             request      229,381
lts__t_requests_op_atom.sum.pct_of_peak_sustained_active                      %        84.46 #无明显差异
lts__t_requests_op_atom.sum.peak_sustained                        request/cycle           18
lts__t_sectors_op_atom.sum                                               sector      229,381
lts__cycles_active.avg                                                    cycle    15,088.72
lts__cycles_active.max                                                    cycle      231,378 #比仅inc或dec要高,说明负载均衡差一些
lts__cycles_active.min                                                    cycle        1,221
lts__cycles_active.sum                                                    cycle      271,597
smsp__inst_executed_op_generic_atom.avg                                    inst        64.04
smsp__inst_executed_op_generic_atom.max                                    inst           69
smsp__inst_executed_op_generic_atom.min                                    inst           64
smsp__inst_executed_op_generic_atom.sum                                    inst        7,173
sm__cycles_elapsed.avg.per_second                                           Ghz         1.32
smsp__cycles_elapsed.avg.per_second                                         Ghz         1.32
smsp__sass_data_bytes_mem_global_op_atom.sum                              Kbyte        28.67 
smsp__sass_inst_executed_op_atom.sum                                       inst        7,168
smsp__sass_inst_executed_op_atom.sum.pct_of_peak_sustained_active             %         0.03
smsp__sass_inst_executed_op_atom.sum.peak_sustained                  inst/cycle          112
smsp__sass_inst_executed_op_global_atom.sum                                inst        7,168
----------------------------------------------------------------- ------------- ------------

三.复现过程

# 生成Kernel代码
tee atomic_kernel.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>__device__ unsigned int inc_count = 0;
__device__ unsigned int dec_count = 65535000;#define LOOP_COUNT 32__global__ void atomic_kernel(float *input,float *output,int mode) {unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;unsigned int inc_temp=0;unsigned int dec_temp=0;unsigned int start_cycle, end_cycle;void *ptr0=&inc_count;void *ptr1=&dec_count;if(mode==0){//inc+inc__syncthreads();asm volatile ("mov.u32 %0, %%clock;" : "=r"(start_cycle) :: "memory");#pragma unrollfor(int i=0;i<LOOP_COUNT;i++){asm("atom.global.inc.u32 %0, [%1], %2;" : "=r"(inc_temp) : "l"(ptr0), "r"(inc_temp));asm("atom.global.inc.u32 %0, [%1], %2;" : "=r"(inc_temp) : "l"(ptr0), "r"(inc_temp));}// __syncthreads();   asm volatile ("mov.u32 %0, %%clock;" : "=r"(end_cycle) :: "memory");input[tid]=inc_temp+dec_temp;if(tid==0){printf("inc+inc:%lld\n",end_cycle-start_cycle);}}if(mode==1){//inc+dec__syncthreads();asm volatile ("mov.u32 %0, %%clock;" : "=r"(start_cycle) :: "memory");#pragma unrollfor(int i=0;i<LOOP_COUNT;i++){asm("atom.global.inc.u32 %0, [%1], %2;" : "=r"(inc_temp) : "l"(ptr0), "r"(inc_temp));asm("atom.global.dec.u32 %0, [%1], %2;" : "=r"(dec_temp) : "l"(ptr1), "r"(dec_temp));}   // __syncthreads();asm volatile ("mov.u32 %0, %%clock;" : "=r"(end_cycle) :: "memory");input[tid]=inc_temp+dec_temp;if(tid==0){printf("inc+dec:%lld\n",end_cycle-start_cycle);}}if(mode==2){//dec+dec__syncthreads();asm volatile ("mov.u32 %0, %%clock;" : "=r"(start_cycle) :: "memory");#pragma unrollfor(int i=0;i<LOOP_COUNT;i++){asm("atom.global.dec.u32 %0, [%1], %2;" : "=r"(dec_temp) : "l"(ptr1), "r"(dec_temp));asm("atom.global.dec.u32 %0, [%1], %2;" : "=r"(dec_temp) : "l"(ptr1), "r"(dec_temp));}   //__syncthreads();asm volatile ("mov.u32 %0, %%clock;" : "=r"(end_cycle) :: "memory");input[tid]=inc_temp+dec_temp;if(tid==0){printf("dec+dec:%lld\n",end_cycle-start_cycle);}}  
}
EOF# 编译Kernel
/usr/local/cuda/bin/nvcc -std=c++17 -dc -lineinfo -arch=sm_86 -ptx atomic_kernel.cu -o atomic_kernel.ptx
/usr/local/cuda/bin/nvcc -arch=sm_86 atomic_kernel.ptx -cubin -o atomic_kernel.cubin
/usr/local/cuda/bin/nvcc -arch=sm_86 atomic_kernel.cubin -fatbin -o atomic_kernel.fatbin
cat atomic_kernel.ptx
/usr/local/cuda/bin/cuobjdump --dump-sass atomic_kernel.fatbin# 生成测试代码
tee atomic_kernel_main.cpp<<-'EOF'
#include <stdio.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cuda.h>int main(int argc,char *argv[])
{CUresult error;CUdevice cuDevice;cuInit(0);int deviceCount = 0;error = cuDeviceGetCount(&deviceCount);error = cuDeviceGet(&cuDevice, 0);if(error!=CUDA_SUCCESS){printf("Error happened in get device!\n");}CUcontext cuContext;error = cuCtxCreate(&cuContext, 0, cuDevice);if(error!=CUDA_SUCCESS){printf("Error happened in create context!\n");}CUmodule module;CUfunction function;const char* module_file = "atomic_kernel.fatbin";const char* kernel_name = "_Z13atomic_kernelPfS_i";error = cuModuleLoad(&module, module_file);if(error!=CUDA_SUCCESS){printf("Error happened in load moudle %d!\n",error);}error = cuModuleGetFunction(&function, module, kernel_name);if(error!=CUDA_SUCCESS){printf("get function error!\n");}int block_count=28;int block_size=32*4;int thread_size=block_count*block_size;int data_size=sizeof(float)*thread_size;float *dev_mem=nullptr;int cudaStatus=0;cudaStatus = cudaMalloc((void**)&dev_mem, data_size*3);if(cudaStatus){printf("cudaMalloc1 Failed\n");}float *input_ptr[2]={&dev_mem[0],&dev_mem[thread_size*2]};for(int mode=0;mode<3;mode++){void *kernelParams[]= {(void*)&input_ptr[0], (void*)&input_ptr[1],(void*)&mode};auto ret=cuLaunchKernel(function,block_count, 1, 1,block_size,1,1,0,0,kernelParams, 0);cudaError_t cudaerr = cudaDeviceSynchronize();if (cudaerr != cudaSuccess){printf("kernel launch failed with error \"%s\".\n",cudaGetErrorString(cudaerr));  }}  cudaFree(dev_mem);cuModuleUnload(module);cuCtxDestroy(cuContext);return 0;
}
EOF
# 编译测试代码
g++ atomic_kernel_main.cpp -o atomic_kernel_main -I /usr/local/cuda/include -L /usr/local/cuda/lib64 -lcudart -lcuda# Profing
/usr/local/NVIDIA-Nsight-Compute/ncu --metrics smsp__inst_executed_op_generic_atom,\
smsp__sass_inst_executed_op_atom.sum,\
smsp__sass_inst_executed_op_atom.sum.peak_sustained,\
smsp__sass_inst_executed_op_atom.sum.pct_of_peak_sustained_active,\
lts__t_sectors_op_atom.sum,\
lts__t_requests_op_atom.sum,\
lts__t_requests_op_atom.max,\
lts__t_requests_op_atom.min,\
lts__cycles_active,\
sm__cycles_elapsed.avg.per_second,\
smsp__cycles_elapsed.avg.per_second,\
lts__d_atomic_input_cycles_active.sum,\
lts__cycles_elapsed.avg.per_second,\
lts__t_requests_op_atom.sum.peak_sustained,\
lts__t_requests_op_atom.max.peak_sustained,\
lts__t_requests_op_atom.sum.pct_of_peak_sustained_active,\
smsp__sass_inst_executed_op_global_atom.sum,\
smsp__sass_data_bytes_mem_global_op_atom.sum ./atomic_kernel_main

http://www.ppmy.cn/embedded/105732.html

相关文章

无人机反制:无线电侦测设备技术详解

无人机反制技术中的低空安全综合管理平台&#xff0c;作为守护低空安全的重要工具&#xff0c;集成了多种先进的技术手段和管理功能&#xff0c;实现了对无人机等低空飞行器的全方位、无死角监控与反制。以下是对该技术平台的详细解析&#xff1a; 一、技术架构与核心功能 低…

Android Audio基础——音频模式设置(十九)

在《音频属性设是置》中介绍使用 setParameters 设置音频属性时,就是以设置音频模式及为例进行讲解的,其实在 AudioManager 中同样存在一个接口用来设置音频模式的,这里我们就来看一下。 一、音频模式 1、基础介绍 音频模式对于控制不同场景下的音频输出是非常有用的。 模…

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写&#xff0c;它是一个允许计算机短期存储数据以更快访问的组件。众所周知&#xff0c;操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时&#xff0c;CPU 会将数据传输到 RAM 中进行计…

docker Desktop报错 error pulling image configuration 处理

问题描述 在 docker 拉数据 出现以下错误 error pulling image configurarion&#xff1a; 这个问题 主要是 可能应该某些原因不能网络无法连上镜像 原因分析&#xff1a; 1。 2024年 5月以后 国内很多IP都 。。。懂的都懂&#xff0c;很多 VPN 也是。。。 懂的都懂&#x…

SQLite3 数据类型深入全面讲解

SQLite3&#xff0c;作为一款轻量级的数据库管理系统&#xff0c;在数据存储方面展现出了其独特的魅力。它不仅支持标准的SQL语法&#xff0c;还提供了丰富的数据类型供开发者选择。这些数据类型不仅涵盖了基本的数值和文本类型&#xff0c;还包括了日期时间、二进制数据等复杂…

xss-labs靶场全关通关

1、level-1 1、输入&#xff0c;发现会将我们输入的内容显示&#xff1a; 2、若未做任何过滤就进行输出&#xff0c;那我们就可以嵌入js代码&#xff0c;执行js脚本&#xff1a; 输入&#xff1a;<script>alert(111)</script> <script></script>&…

计算机网络 第2章 物理层

文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&…

深度学习TensorFlow框架

深度学习介绍 深度学习和机器学习区别 机器有人工参与&#xff0c;而深度学习是靠网络&#xff1b; 深度学习需要大量的数据集&#xff0c;训练神经网络需要大量的算力 机器学习有&#xff1a;朴素贝叶斯&#xff0c;决策树等 深度学习主要是神经网络 深度学习应用场景 CV&…

一键编译QT5源码脚本(交叉编译arm64、mips64版本)

前言 这几天为了编写国产专用机上的软件&#xff0c;又盘起了交叉编译.. 一开始想使用深度最新的deepin 23正式版做系统&#xff0c;搭建编译环境。然而交叉编译链工具直接安装失败&#xff01; 然后又装了Debian12原版系统&#xff0c;编译环境倒是顺利搭建起来&#xff0c…

图像缩放操作

图像缩放操作 微信公众号&#xff1a;幼儿园的学霸 在图像处理过程中&#xff0c;有时需要把图像调整到同样大小&#xff0c;便于处理&#xff0c;这时需要用到图像resize()&#xff0c;该函数比较简单&#xff0c;此处对函数中涉及的各种插值方法进行分析。 目录 文章目录 图…

详情页底部fixed去除抖动

背景 当我们有类似这样的需求&#xff0c;详情页底部需要放很多个操作按钮&#xff08;如关闭、审批通过、驳回等&#xff09;&#xff0c;然后主内容区域可以滚动。 那么我们通常会把底部这一栏内容用fixed固定在底部&#xff0c;如下示例&#xff1a; 但是这样有一个问题&a…

828华为云征文|华为云Flexus X实例部署k3s与kuboard图形化管理工具

828华为云征文&#xff5c;华为云Flexus X实例部署k3s与kuboard图形化管理工具 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定…

chapter13-常用类——(包装类)——day15

目录 460-八大Wrapper类 461-装箱和拆箱 462-包装类测试 463-包装类方法 464-Integer创建机制 465-Integer面试题 460-八大Wrapper类 &#xff08;面向对象里面最重要的就是继承关系&#xff0c;所以要进行梳理&#xff09; 实现了了两个接口&#xff0c;继承了Object父…

【话题】提升开发效率的秘密武器:探索高效编程工具

目录 哪个编程工具让你的工作效率翻倍&#xff1f; 引言 方向一&#xff1a;工具介绍 方向二&#xff1a;效率对比 方向三&#xff1a;未来趋势 哪个编程工具让你的工作效率翻倍&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关…

设计模式相关

设计模式相关 本节知识点 工厂模式及自定义事件抽离英雄基类设计原则单例模式使用装饰者模式使用代理模式观察者模式适配器模式… 课堂目标 学会各种设计模式的使用学会面向对象中抽象使用理解类中的继承oop思想规划项目 设计原则 SOLID(稳定的) 单一职责原则&#xff08…

基于vue框架的朝阳保险公司营销管理系统0wamc(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,保险信息,保险类型,订单信息,赔偿信息,联系我们,购买指南,到期提醒 开题报告内容 基于Vue框架的朝阳保险公司营销管理系统的开题报告 一、研究背景 随着保险行业的快速发展和市场竞争的日益激烈&#xff0c;传统的管理模式已难以…

insert 等待 index maintenacne

insert 所在表上index 十几个&#xff0c;导致index维护时间占了insert的 67% 灰色Timeline可以看到index maintenacne耗时最多。

redis的共享session应用

项目背景&#xff1a; 该项目背景就是黑马的黑马点评项目。 一&#xff1a;基于Session实现验证码登录流程 基本的登录流程我们做了很多了。这个是短信登录流程 其实和普通的登录流程就多了一个生成验证码&#xff0c;并将验证码保存在session中&#xff0c;并且呢&#xf…

【网络】NAT、代理服务、内网穿透

NAT技术与代理服务 文章目录 1.NAT技术1.1NAT技术背景1.2NAT IP转换过程1.3NAPT1.4NAT技术的缺陷 2.代理服务器3.NAT和代理服务器的区别4.内网穿透 1.NAT技术 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&#xff0c;是解决IP地址不…

qt配合halcon深度学习网络环境配置

1.开发环境qt6&#xff0c;编译器MSCV2019&#xff0c;网络是halcon的对象检测&#xff0c;halcon用20. 2.建立qt项目 3.到halcon安装目录下复制include,lib这两个文件夹到qt项目中进行引用 4.引用到halcon静态库后&#xff0c;到halcon运行目录下找到静态库对应dll文件&…