Windows上使用VTune分析PyTorchExtension调用的Cpp程序

news/2024/7/8 4:44:49/文章来源:https://www.cnblogs.com/YuanZiming/p/18276257

概述

最近在实现一个通过PyTorch Extension扩展PyTorch算子的C++算法,需要分析代码的运行瓶颈进行针对性优化。Intel VTune就是一个能从汇编级和源码级分析CPU运行瓶颈的工具。由于不明原因我没在服务器上跑通命令行版的VTune,所以把程序搬到Windows下分析了,因此记录一下Windows上使用VTune分析PyTorchExtension调用的Cpp程序的全配置流程。

跑通Python程序

第一步是跑通Python程序,主要是配置工具链实现对C++算子的JIT编译。Python这边的配置就不说了,按错误提示补全没装的库(如Ninja)就行,这里说一下Windows下编译器工具链的安装。由于Windows下PyTorch是用微软的编译器MSVC编译的,所以要编译我们的算子也得用MSVC,首先就得安装(如果之前装过Visual Studio的C++编译套件就可以跳过这一步):

  1. 下载Visual Studio Installer,和系统适应的版本就行。
  2. 在Visual Studio Installer选择要安装的工具,在“单个组件”里找到MSVC生成工具和Windows SDK,选最新版本的即可。

MSVC生成工具包含编译器、链接器等工具,Windows SDK则包含了操作系统相关的库。这也纠正了我之前的观点,我以为C/C++和其他现代语言一样,标准库和操作系统无关,编译工具链装上就自动有标准库了,实际上并不是,对于那些C相关的库,MSVC生成工具里就只有里面啥也没有的cstdiocstdlib这些头文件,只有装了Windows SDK,它们才能引用到真正包含库函数的stdio.hstdlib.h这些头文件,就和Linux里单装gcc不行,还得装上glibc才能编译C/C++程序。

  1. 安装完之后就可以运行了,在此之前如果程序是从Linux里搬过来的,需要改一下编译参数,因为MSVC的编译参数和gcc不太一样,如-std=c++17需要改成/std:c++17-O2改成/O2。以及关于AVX的使用,gcc需要具体指定使用的AVX指令的类别,而MSVC只有AVX、AVX2、AVX512三个级别依次升高的选项。比方说我要用_mm256_fmadd_ps这个函数,如果是MSVC直接用/arch:AVX2就可以了,而gcc则要用-mfma指定具体用的是AVX里的FMA系列指令,AVX的具体指令类别可参考Intel的文档,gcc的相关编译参数可参考gcc的文档。
  2. 从开始菜单进入MSVC的命令行环境x64 Native Tools Command Prompt for VS 2022,cd到Python脚本所在位置,然后运行脚本,如果可以顺利运行说明配置完成。

VTune配置

VTune里创建项目然后点Configure Analysis就能配置运行,填上程序(python)、参数(脚本文件名)和工作目录(脚本运行时的当前路径)即可。

不过不能直接运行,因为MSVC的环境变量是通过脚本配置的,前面之所以要进入专门的MSVC命令行环境也是这个原因。所幸VTune提供Wrapper Script功能(在Advace Option里面),可以写一个批处理脚本让它在启动Python之前先运行MSVC的脚本配置环境变量:

call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
%*

第一行就是运行用来配置环境变量的脚本,脚本的路径视Visual Studio的安装路径而定,第二行表示运行VTune分析的程序。在VTune的Wrapper Script里加载这个脚本,点左下角的运行按钮,就可以顺利运行了。

分析的过程中需要对照汇编代码和C++代码,这就需要给程序添加调试信息,只需要在Python脚本里添加编译参数-Z7添加链接参数/DEBUG即可,即:

extension = load(name='extension',sources=['extension.cpp'],extra_cflags=['/std:c++17', '/O2', '-Z7', '/arch:AVX2'],extra_ldflags=['/DEBUG'],verbose=True)

这样就能在VTune里浏览C++代码了,再次强调/DEBUG是加在链接参数(extra_ldflags)里面的,放错位置会导致C++代码不显示。

总结

微软的工具链特点就是如果全用它的工具开发(Visual Studio一把梭)就非常方便,傻瓜式操作,但如果想要将它的工具和其他工具协同使用,往往就需要颇费一般功夫,Powershell的二进制管道设计也体现了这一点。不过好在微软的工具链文档也是业界最全的,想搜的东西基本都能搜得到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/734140.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LeetCode] 80. Remove Duplicates from Sorted Array II

原来leetcode使用Count也不需要import collections class Solution:def removeDuplicates(self, nums: List[int]) -> int:# len =0if len(nums) == 0:return 0# elsecountList = Counter(nums)countModify = {key:min(value,2) for key,value in countList.items()}ret = […

个人标语

从来不觉得自己比任何人差,讨厌懒惰,骄傲自满与妄自菲薄。

IDER如何生成数据库的ER图?

1.打开 IDEA,并连接到 MySQL数据库这里连接到你的数据库 2.在菜单栏中选择"View"->"Tool windows"->"Database" 3.在"Database" 工具窗口中,展开你想要査看的数据库,并选择"ER Diagrams"。 4.右键单击"ER Dia…

服务器系统瘫痪系统损坏数据恢复

故障服务器数据恢复环境: 一台故障服务器;共有4块146G SAS硬盘组成的RAID5;故障服务器分析检测: 服务器在运行过程中系统瘫痪,重装系统后系统损坏。系统中有数据库、网站程序与网页。 服务器数据恢复过程: 1、对全盘reiserfs树节点之间的关联确定原来的reiserfs分区位置镜…

服务器瘫痪,里面存有mysql数据库表结构

最上层,大多数基于网络服务器的工具或服务都有类似架构。 第二层,大多数MySQL的核心服务,包括查询解析、分析、优化、缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。 第三层,存储引擎负责MySQL中数据的存储和提取。服务器通过AP…

误操作还原VMware虚拟机数据恢复

故障服务器数据恢复环境: 一台故障物理服务器上迁移到ESXI上的虚拟机。故障服务器检测与分析: 虚拟机的数据恢复迁移的状态,数据全部丢失。还原快照操作与删除数据,将该设备上所有虚拟机关机或迁移到其他ESXI上。 恢复数据之前需要先了解vmfs文件系统的底层结构。vmfs文件系…

存储中NAS卷数据丢失数据恢复

故障服务器数据恢复环境: 一台故障存储,支持SAN和NAS存储协议。服务器故障检测与分析: 存储一个NAS卷中的数据丢失,卷大小为2T,经过检查发现丢失数据的类型为office文档、PDF文件、图片文件(JPG、JPEG、PNG等)。 服务器数据恢复过程: 1、准备好备份服务器,将备份服务器…

系统误操作删除数据恢复

故障服务器环境故障: 一台有文件系统的故障服务器,误操作删了服务器上的数据。服务器数据恢复过程: 1、对故障服务器所有硬盘进行扇区级镜像备份。 2、根据文件系统结构和元信息分析文件系统盘序、使用盘数和校验盘个数等信息。 3、全盘扫描节点入口。 4、扫描所有硬盘的底层…

服务器意外断电导致linux数据目录项数据丢失数据恢复

故障服务器数据恢复环境:​ 一台故障列服务器;做的是linux操作系统。服务器故障检测与分析:​ 因机房在运行中,意外断电导致服务器文件丢失。 服务器数据恢复过程:​ 1、将linux服务器连接到数据恢复服务器,以只读模式进行服务器数据备份,所有的数据恢复操作都在备份上进…

IBM服务器硬盘离线数据恢复

服务器数据恢复故障描述: IBM X3850服务器,服务器挂载了5块73G SAS硬盘组成raid5磁盘阵列。2块硬盘离线,RAID崩溃。 服务器存储有oracle数据库,数据恢复+操作系统复原。服务器磁盘阵列数据恢复流程: 1、关闭服务器做数据恢复,服务器关闭状态保护故障服务器原始状态。 2、…

关于家居强电电路模拟程序3和4总结

前言:对于家居强电电路的3和4总结来说,考察了正则表达式,类的运用,程序与设计的基础使用,ArristList 类的使用等等知识点。相对于家居强电电路3来说,4的难度大得多。在3的基础上,加上了引脚的输出电压,对于输出通过引脚的对应电压。那么要判断更多的东西(比如说引脚是…

我的第三次oop

阅读目录 前言 第四次PTA 第五次PTA 第六次PTA 总结 前言 一:对于java的进一步认识 Java是一种强大、跨平台的编程语言,它以面向对象为核心,拥有自动内存管理、丰富的API和广泛的社区支持。Java的广泛应用领域包括Web开发、移动应用开发、企业级应用以及大数据处理等,其易用…

第三次oop

阅读目录 前言 第四次PTA 第五次PTA 第六次PTA 总结 前言 一:对于java的进一步认识 Java是一种强大、跨平台的编程语言,它以面向对象为核心,拥有自动内存管理、丰富的API和广泛的社区支持。Java的广泛应用领域包括Web开发、移动应用开发、企业级应用以及大数据处理等,其易用…

[算法学习笔记] 树链剖分(重链剖分)

树链剖分(重链剖分)学习笔记概述 树链剖分能将一棵树剖分成若干条链的形式。从而能在树上用一些线性数据结构如线段树,树状数组等维护。树链剖分分为重链剖分,长链剖分,LCT 剖分等。最常用的是重链剖分。本文将讲解重链剖分。 本文将持续更新。 我们接下来给出一些定义。重…

.net8,全网首发:部署为自带环境的前后端分离项目,编译成二进制机器码,防止反编译

环境:win10+.net8+vs2022+vue3(history路由模式)本文只演示在winows上面的部署 目的: 1.防止反编译,增加破解成本 2.更便捷的部署方式,开箱即用 实现: 1.不依赖容器,包括IIS,apache,docker,nginx等 2.更少的文件,所有dll逻辑打包成一个exe文件(如果是win环境是exe…

第7-8次大作业总结

前言: 第七次大作业: 这次大作业中新增了,两个新部件,一个是互斥开关,一个是受控窗帘,互斥开关意味着要用一个电器同时参与两条电路的构建,刚开始我没想好怎么去实现一个电器对两条支路,输出不同的状态,后来想到,不如直接把两个普通开关作为互斥开关的两个属性,把它…

配置自己的免费云主机,阿贝云,免费虚拟主机,免费云服务器

延期需要您在第三方网站发布使用感受,以下是对发布内容的详细要求: (1)比较推荐免费免费云主机,阿贝云,免费虚拟主机,免费云服务器 (2)“阿贝云”"免费虚拟主机"“免费云服务器”,配置使用比较方便简单,正在尝试更多功能,后续使用后再来继续发表 (3)可以…

OOP 7-8总结

oop 7~8总结 前言知识点 整体的知识点与前几次的题目没有太多的不同,每次迭代因为题目要求都有增加,所以会新增一些做法,但是像是继承、集合框架、正则表达式、抽象类、多态以及接口等知识点依然会重复使用,只是用法会不同。 越写到后面我越是意识到算法的重要性。在题目里…

家居强电电路模拟程序的两次迭代(包含最终版本)

目录: 一)前言 二)设计与分析 三)踩坑心得 四)改进建议 五)总结 (2)家居强电电路模拟程序-3: 【1】知识点:ArrayList的运用,物理知识的运用。 【2】题量:较大 【3】难度:较难 在家居强电电路模拟程序的迭代中引出较难的互斥开关 (3)家居强电电路模拟程序-4: 【1】…

免费的数据可视化(PCA、t-SNE和UMAP)网页程序

这是一款免费的数据可视化(PCA、t-SNE和UMAP)网页程序,直接进行在线操作,无需下载。这是一款免费的数据可视化网页程序,直接进行在线操作,无需下载。 URL: https://data-visualization-webapp-by-shuaibingli.streamlit.app/ 总体页面【预处理+可视化(PCA、t-SNE和UMAP)+保…