惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
F
Fortinet All Blogs
L
LangChain Blog
D
Docker
G
Google Developers Blog
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
Vercel News
Vercel News
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
Recorded Future
Recorded Future
I
InfoQ
博客园 - 【当耐特】
The Cloudflare Blog
P
Proofpoint News Feed
GbyAI
GbyAI
博客园 - 司徒正美
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Jina AI
Jina AI
量子位
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
有赞技术团队
有赞技术团队
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
大猫的无限游戏
大猫的无限游戏
F
Full Disclosure
雷峰网
雷峰网
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题

VnYzm的博客

游戏玩后感:ReLief:献给亲爱的你 我的周边(谷子)分享 游戏玩后感:Kanon 简谱:致真实的你 《Rust中常见的有关生命周期的误解》学习笔记 简谱:StarMap 简谱:かく咲きたらばいと恋ひめやも 简谱:东风 简谱:无法诉说的思念 简谱:Girlish 游戏玩后感:时钟机关的Layline 简谱:风之琶音 简谱:星空的记忆 简谱:因为遇见了你 简谱:月童 番茄简谱脚本转调器 游戏玩后感:青空下的约定:Refine 游戏玩后感:在这苍穹展翅 书籍读后感:控制论与科学方法论 游戏玩后感:恋爱表达式 游戏玩后感:樱之诗 MLIR-tutorial学习笔记 游戏玩后感:潜伏之赤途 游戏玩后感:纯爱咖啡厅:帕露菲重制版 游戏玩后感:智以泪聚 游戏玩后感:初雪樱 游戏玩后感:告别回忆:从今以后 游戏玩后感:梦灯花 游戏玩后感:金辉恋曲四重奏 游戏玩后感:五彩斑斓的世界 昇腾310P使用记录 游戏玩后感:AIR 游戏玩后感:弹丸论破 游戏玩后感:流景之海的艾佩莉亚 Xilinx_HLS上板过程记录 游戏玩后感:告别回忆2 游戏玩后感:恋爱绮谭 Faiss和Rapidsai_Raft使用记录 游戏玩后感:近月少女的礼仪 游戏玩后感:樱色之云,绯色之恋 游戏玩后感:幸运草的约定 游戏玩后感:星之梦、候鸟和丸子与银河龙 游戏玩后感:白色相簿2 SpinalHDL上板过程记录 游戏玩后感:仰望夜空的星辰 最简单的算卦方法之一:梅花易数法 游戏玩后感:苍之彼方的四重奏 krkr引擎解包工具介绍 自定义CUDA实现PyTorch算子的四种简单方法 游戏玩后感:星空的记忆 游戏玩后感:9nine 游戏玩后感:AtriMyDearMoments 游戏玩后感:极限脱出 游戏玩后感:魔女的夜宴 SSH实现多跳代理 动漫观后感:向山进发 flv重封装H264、AAC流 动漫观后感:夏日重现 CSP模板 游戏玩后感:海沙风云 动漫观后感:灵能百分百 游戏玩后感:交响乐之雨 游戏玩后感:爱上火车LastRun 游戏玩后感:LittleBustersEX 游戏玩后感:SummerPockets 游戏玩后感:逆转裁判 Ultra96V2开发板简单使用 SpinalWorkshop实验笔记(三) SpinalWorkshop实验笔记(二) SpinalWorkshop实验笔记(一) PYNQ开发板上使用USB声卡+OSS兼容层播放音频 TestOS移植K210开发板 rCore-Tutorial-Book-v3学习笔记(七) 动漫观后感:凉宫春日的忧郁 rCore-Tutorial-Book-v3学习笔记(♭七) rCore-Tutorial-Book-v3学习笔记(六) rCore-Tutorial-Book-v3学习笔记(五) rCore-Tutorial-Book-v3学习笔记(四) rCore-Tutorial-Book-v3学习笔记(三) rCore-Tutorial-Book-v3学习笔记(二) rCore-Tutorial-Book-v3学习笔记(一) 游戏玩后感:RewritePlus MIT-6.S081-2020实验(xv6-riscv64)十一:net MIT-6.S081-2020实验(xv6-riscv64)十:mmap MIT-6.S081-2020实验(xv6-riscv64)九:fs MIT-6.S081-2020实验(xv6-riscv64)八:lock MIT-6.S081-2020实验(xv6-riscv64)七:thread MIT-6.S081-2020实验(xv6-riscv64)六:cow MIT-6.S081-2020实验(xv6-riscv64)五:lazy MIT-6.S081-2020实验(xv6-riscv64)四:traps MIT-6.S081-2020实验(xv6-riscv64)三:pgtbl MIT-6.S081-2020实验(xv6-riscv64)二:syscall 动漫观后感:吹响吧上低音号 MIT-6.S081-2020实验(xv6-riscv64)一:util 快速生成网络mp4视频缩略图技术 用plantuml画图示例 QQ缩略图和大图不同实现 Python制作字符图片 动漫观后感:命运石之门 使用OpenCV对图片进行特征点检测和匹配
Windows上使用VTune分析PyTorchExtension调用的Cpp程序
VnYzm · 2024-01-01 · via VnYzm的博客

概述

最近在实现一个通过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的二进制管道设计也体现了这一点。不过好在微软的工具链文档也是业界最全的,想搜的东西基本都能搜得到。