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

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
H
Hacker News: Front Page
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
博客园 - 叶小钗
Last Week in AI
Last Week in AI
Recent Announcements
Recent Announcements
P
Palo Alto Networks Blog
Webroot Blog
Webroot Blog
Hacker News: Ask HN
Hacker News: Ask HN
IT之家
IT之家
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
P
Privacy & Cybersecurity Law Blog
C
Cisco Blogs
罗磊的独立博客
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
Y
Y Combinator Blog
AWS News Blog
AWS News Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
K
Kaspersky official blog
博客园 - 司徒正美
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Archives - TechRepublic
Security Archives - TechRepublic
The Last Watchdog
The Last Watchdog
Jina AI
Jina AI
MyScale Blog
MyScale Blog
TaoSecurity Blog
TaoSecurity Blog
大猫的无限游戏
大猫的无限游戏
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
美团技术团队
T
Tor Project blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 【当耐特】
博客园 - 聂微东
V2EX - 技术
V2EX - 技术
I
Intezer
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell

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