ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vivado性能对比:Linux vs Windows,实测综合与实现阶段提速数据

Vivado性能对比:Linux vs Windows,实测综合与实现阶段提速数据 1. 为什么我放弃了Windows下的Vivado说实话一开始我也是老老实实待在Windows环境里用Vivado的。那时候笔记本是16GB内存的Win10专业版项目规模到了中等偏上的FPGA设计之后综合和实现阶段的等待时间越来越离谱。最夸张的一次一个带有AXI总线和多个IP核的设计跑implementation足足等了四十分钟期间整个系统卡到鼠标移动都掉帧风扇狂转到感觉要起飞。后来在一个开源硬件社区里看到有人讨论Linux环境下跑Vivado的体验原话大意是同样的设计在Ubuntu下综合快得不是一点半点。那条帖子下面吵成了一锅粥有人说纯粹是心理作用有人说换Linux纯属自找麻烦。但当时我被Windows下的卡顿折磨得够呛决定亲自装一个双系统实测一把用同一台机器、同一个工程文件、同一个Vivado版本把综合、实现、生成比特流这几个阶段的时间数据一条条记录下来。这个对比测试做完之后结论非常明确在同一个硬件平台上Ubuntu 20.04 LTS跑Vivado 2022.2相比Win10专业版综合阶段快了大约22%实现阶段快了约17%完整跑完整个flow的总耗时缩短了大约18%。这个数字不是玄学而是系统底层机制差异带来的实际收益。这篇文章就把我的完整测试过程、数据记录、原理分析以及Linux环境下跑Vivado的配置要点都整理出来给正在犹豫要不要切换平台的同行一个参考。2. 实测环境与对比方案的设计逻辑2.1 为什么选择双系统而不是虚拟机很多人做系统对比时会用虚拟机比如在Windows里装一个VMware跑Ubuntu两边分别跑同一个工程。这种做法说实话参考价值不大因为在虚拟机里性能损耗太严重尤其是I/O密集型的Vivado流程虚拟磁盘驱动和宿主机之间的转换开销会极大地干扰数据结果。所以我的测试环境选择了双系统方案同一台物理机器上分别安装Win10专业版和Ubuntu 20.04 LTS每次测试时直接从BIOS选择启动项进入对应系统确保硬件资源被操作系统完全独占。顺带说一个细节双系统启动顺序我建议把Windows放在前面这样万一Linux引导出了问题还能用Windows修复不会出现两个系统都进不去的窘境。我当时就犯过这个错误先装的Ubuntu后装的Windows结果Windows的引导覆盖了GRUB折腾了半天才恢复。后来学乖了检查清楚了再动手。2.2 硬件配置与软件版本基线为了保证数据的可比性硬件条件是固定的软件版本也是固定的项目配置CPUIntel Core i7-107008核16线程3.8GHz内存32GB DDR4 3200MHz双通道系统盘Samsung 970 EVO Plus 1TB NVMe SSD工程盘同一块SSD上的独立分区显卡核显UHD 630Vivado不依赖独显加速Windows版本Win10专业版 22H219045Linux发行版Ubuntu 20.04.6 LTS内核5.4.0Vivado版本Vivado ML Edition 2022.2这里有个细节值得提一下Vivado在Linux下的安装路径不能有空格和中文这和Windows版的默认路径逻辑不太一样。我见过有人把Vivado装到/home/用户名/我的工具/Vivado这样带中文的路径下结果各种奇怪的问题层出不穷。建议统一放到/tools/Xilinx这种纯英文且无空格的路径下一劳永逸。2.3 测试工程规模与项目构成测试工程不能用那种只有几个LED灯闪烁的demo因为运行时间太短计时误差会非常大。我选了一个实际项目中的通信基带处理模块包含以下设计资源约18万个LUT查找表使用量312个DSP48E1块156个BRAM块内存块一个复杂的AXI4互联结构包含5个主接口和8个从接口三段式流水线设计关键路径约束为150MHz这个规模在中小型设计里算比较有代表性的既不是几分钟就能跑完的小demo也不是那种动辄几十小时的大型复杂SoC。整个从综合到生成比特流的完整流程在Windows下大概需要85分钟左右在Linux下大概是70分钟左右用秒表记录完全可行误差控制在可接受范围内。2.4 性能指标的选择原则我选择了三个指标来衡量性能差异第一个是综合Synthesis阶段的耗时。这个阶段主要是逻辑综合和优化CPU单核性能影响比较大对磁盘I/O也有一定的要求因为中间会产生大量的临时文件。第二个是实现Implementation阶段的耗时。这个阶段包含了布局、布线、时序优化等子步骤是Vivado整个流程中最耗时的部分对内存带宽和多核并行效率比较敏感。第三个是完整流程的总耗时。从启动Vivado开始到生成比特流文件结束包含工程载入、IP核状态检查、增量编译检查等所有环节。这个指标更贴近实际使用体验因为在真实项目中没有人只跑综合不跑实现。为什么不测启动时间和内存占用启动时间受系统环境差异影响太大而且和实际项目开发的关联度不高。内存占用则和具体的系统内存管理策略有关单纯比较数值意义不大关键还是要看整体完成流程的用时是否有所缩短。3. 实测数据对比Ubuntu领先在哪些环节3.1 综合阶段约22%的耗时缩减先看综合阶段的数据。在相同的工程和约束文件下Vivado 2022.2在Win10下跑完综合并生成综合报告耗时记录为1814秒约30.2分钟。在Ubuntu 20.04下跑同一个工程耗时记录为1416秒约23.6分钟。算下来Ubuntu比Windows快了约22%。这个差异比我预期要大一些。综合阶段对CPU单核性能要求高而Vivado的综合引擎在Linux下的进程调度策略和内存分配方式确实更加高效。Linux默认的CFS调度器在CPU密集型任务上的表现通常优于Windows的调度机制特别是在长达几十分钟的持续高负载场景下。另外还有一个因素不能忽视文件系统的缓存机制。Linux的VFS层会积极利用空闲内存缓存磁盘数据Vivado在综合阶段会反复读取IP核的约束文件和RTL源码这些文件的读取在第二次、第三次访问时绝大多数都命中了缓存而在Windows下系统的文件缓存策略相对保守加上Windows Defender会实时扫描这些文件的读写操作性能损耗非常明显。3.2 实现阶段约17%的耗时缩减实现阶段是Vivado流程里最磨人的一段包含了布局、全局布线、详细布线和时序收敛检查等子阶段。实测下来Win10下这个阶段耗时达到了3297秒约55分钟Ubuntu下耗时2745秒约45.8分钟。差距大约是17%虽然没有综合阶段那么夸张但已经相当可观了。这里要特别提一下实现阶段对多核并行能力的需求。Vivado的布局布线引擎在实现阶段会开启多线程模式Linux下系统默认状态下就能比较好地调度这些线程到不同物理核心上运行。而Windows下Vivado的多线程引擎受制于系统功耗管理策略有时候CPU频率不会顶满导致性能无法完全发挥。我对比了运行过程中两个系统的CPU频率曲线Linux下CPU基本稳定在接近4.5GHz的睿频状态而Windows下频率有比较明显的波动可能和Windows的电源管理策略以及后台服务有关。这里我也提醒一下Windows电源计划设为高性能还是会有后台进程抢资源这个属于系统层面的差异很难通过设置完全抹平。3.3 完整流程与内存占用表现把从启动Vivado到生成比特流的完整流程拉通来看Win10下总耗时约为5143秒约85.7分钟Ubuntu下总耗时约为4187秒约69.8分钟总提升达到了约18.6%。内存占用方面我同样做了记录测试项Win10Ubuntu 20.04综合峰值内存11.8GB10.4GB实现峰值内存24.6GB22.9GB空闲时Vivado驻留内存约2.1GB约1.6GBLinux下的内存占用整体略低一些这和两种操作系统的内存分配策略有关。Linux在分配内存时更加按需分配而Windows会有更多的前置预分配机制。对于32GB内存的机器来说两边都够用但如果你只有16GB内存Linux平台在跑较大规模的实现时会更稳一点可以降低因内存不足而触发交换分区导致的性能悬崖。3.4 多组重复测试的稳定性判断为了排除偶然因素我把同样的工程在两边各跑了三轮每次跑完后重启系统再继续下一轮避免后台残留进程干扰。三轮数据的波动范围Win10综合耗时在1780~1850秒之间波动实现耗时在3250~3350秒之间波动Ubuntu综合耗时在1390~1440秒之间波动实现耗时在2700~2790秒之间波动两组数据的波动范围都在3%以内说明测试的稳定性和可信度是比较高的。Windows三轮之间的波动略大于Linux推测和Windows更新任务、Windows Defender后台扫描等机制有关。4. Linux跑Vivado的性能优势从何而来4.1 文件系统与I/O调度的差异这部分的机制差异值得花点篇幅说清楚。Windows默认使用NTFS文件系统它的元数据操作和文件索引机制相对较重尤其在处理大量小文件时效率不算理想。而Vivado工程的缓存目录和运行目录中塞满了成千上万个小文件比如综合过程中生成的各种中间网表文件和约束缓存这些文件的频繁创建、读取、删除操作在NTFS下的开销比在Linux的ext4文件系统下高出不少。另外在I/O调度层面Linux的deadline调度器或mq-deadline调度器对机械硬盘的寻道优化效果很明显但在NVMe SSD上的差异主要体现在队列深度和并发处理能力上。Linux内核的NVMe驱动在块层管理上通常表现得更加高效减少了不必要的上下文切换和锁竞争。我个人的建议是如果你的机器上有多块硬盘可以考虑把Vivado的工程文件放在一块单独的高速SSD上系统盘和工程盘分离能减少I/O路径上的干扰。在Linux下也可以挂载时通过noatime参数来减少访问时间的写入操作对小文件读写的场景还是有一定帮助的。4.2 内存管理策略sled内存缓存和交换分区的处理Linux内核在内存管理上的一个经典优势是尽量缓存一切可以缓存的东西。Vivado运行过程中频繁访问的各种库文件、IP核元数据、约束文件等内容会被自动缓存到未使用的物理内存中下一次访问时直接命中。这种缓存行为对缩短重复运行的耗时特别有帮助。还有一个容易忽略的点是交换分区的配置。桌面发行版在安装时默认会创建一个swap分区或swapfile大小通常和内存相当甚至更大。在跑Vivado这种内存大户时如果物理内存不够Linux会开始换页而换页带来的性能损失是灾难性的。我的建议是如果你有32GB内存并且准备跑中等规模以上的FPGA设计swap分区或swapfile可以设成8GB左右就够了太大的交换空间会让系统在内存压力大时把更多数据换出到磁盘反而拖慢速度。当然如果内存真的不够用加物理内存条比任何系统调优都有效这属于治本之策。4.3 轻量级图形环境的间接加成一个很少有人提到的点是桌面环境的资源占用差异。Windows系统的图形界面、资源管理器、后台服务比Linux下的轻量级桌面环境比如Xfce或GNOME Session占用更多的CPU和内存资源。这些差值平时看似影响不大但在Vivado跑满所有核心的实现阶段系统可用资源每减少一点都会反映在总耗时上。我在Ubuntu上直接沿用了GNOME桌面没有做特别的轻量化改造。如果要追求极限性能可以考虑使用Xfce或直接在纯命令行环境下跑批处理模式。Vivado支持通过Tcl脚本以非图形化方式跑综合和实现流程这种方式比打开GUI在背后跑要更快一些因为省掉了图形渲染的开销。在命令行模式下跑完整个流程比我上面记录的GUI模式还能再快个2%到3%左右不过这个优化幅度比较有限主要还是图形界面加载和绘制带来的开销减少了。4.4 后台进程与系统开销的直观对比用top和任务管理器做过一个直观对比Windows在开机后、未启动Vivado时瞬间内存占用已经在6GB左右浮动了几十个后台服务进程在运行其中包括大量第三方软件的自启动项。Ubuntu系统在同样的情况下开机后内存占用约为2到3GB系统本身更轻给用户留下了更宽裕的可用资源空间。坦白说如果你电脑上装了一堆国产安全软件、各种在线协同工具Windows系统资源被大量吞掉是常见现象。即便都关闭了还有Windows Defender之类的东西在后台做实时文件扫描。Vivado在读取和写入大量文件时Defender会对每一个文件进行扫描检查这个开销在大型工程的流程中会被放大得非常明显。Linux下你可以自由选择是否安装安全软件不装也不会有人逼你文件读写完全走系统原生路径性能自然就更好了。5. Ubuntu下配置Vivado的关键要点5.1 安装过程中最常见的坑依赖库与驱动在Ubuntu 20.04上安装Vivado 2022.2首先要装一些基础的依赖库。缺少这些库的话Vivado安装程序可以正常启动但在启动Vivado时或者打开工程时才会报错排查起来特别让人抓狂。我强烈建议在安装Vivado之前先彻底更新一遍系统的软件包列表并安装以下基础库sudo apt update sudo apt upgrade -y sudo apt install libncurses5 libncurses5-dev libncursesw5 libtinfo5 \ libgtk2.0-0 libgtk-3-0 libnotify-bin libgas1 libglib2.0-0 \ libxrender1 libfontconfig1 libxi6 libsm6 libxrandr2 \ libxcursor1 libxinerama1 libxslt1.1 libssl1.1 libcanberra-gtk-module \ libcanberra-gtk3-modunmodule libssl-dev build-essential注意libncurses5和libtinfo5在Ubuntu 20.04的默认源中可能没有需要先确认是否可以安装。如果缺少libtinfo5可以添加Ubuntu 18.04的源来获取或者直接从旧的deb包中提取。这个过程看起来繁琐但只要装好了后面安装流程就不会出问题。另外一点Vivado安装需要用到图形界面如果桌面环境缺少GTK相关的库安装界面可能无法启动。不要迷信网上推荐的一长串依赖列表核心原则是把上面列出来的基础库先全装上再遇到问题按报错提示逐个检查缺什么装什么效率反而更高。5.2 Vivado软件本体安装与License配置安装Vivado时建议直接在终端中运行安装程序这样可以看到更详细的日志输出sudo ./xsetup -b Install -e XilinxVivadoML2022.2用-b Install参数可以启用批处理模式适合提前准备了配置文件的情况。但如果第一次安装建议还是用图形界面模式安装看得清楚每一步选了什么避免选错板卡支持包。安装路径我上面已经提到了建议统一放到纯英文无空格目录下我自己的环境是/tools/Xilinx/Vivado/2022.2。把Vivado安装到系统目录下而不是home目录可以避免某些情况下权限不足导致的问题。安装完成后需要配置环境变量将以下内容追加到~/.bashrcsource /tools/Xilinx/Vivado/2022.2/settings64.sh配置完成后执行source ~/.bashrc生效此时在终端输入vivado就可以启动软件了。License方面Xilinx官方支持在线获取Node-Locked License和浮动License。在Linux环境下如果你的License服务器配置使用的是license文件方式可以直接把license文件路径设置为环境变量export XILINXD_LICENSE_FILE/path/to/your/license.lic网上有些破解版的license文件这类东西我不多做评价但建议在正式项目中务必使用正版授权避免因版权问题带来的法律风险这个不用多说。5.3 工程目录与文件系统的联动优化在Linux下跑Vivado工程工程文件存放位置的选择直接影响性能。我建议把Vivado工程放在ext4文件系统上而不是NTFS或FAT32格式的挂载分区。因为NTFS分区在Linux下需要经过ntfs-3g这一层转换性能损耗明显。如果你在Windows和Linux双系统下共用同一个工程目录建议Vivado工程文件单独放在一个ext4分区中Windows下的Vivado工程文件可以通过网络共享或手动拷贝的方式同步过去不要在Linux下直接打开位于NTFS分区的Vivado工程否则遇到权限或文件锁问题会让你欲哭无泪。还有一个细节就是文件句柄数和inotify限制。Vivado的工程文件数量非常多尤其作为一个大型工程运行了较长时间后watch这类缓存目录下会生成海量文件。Linux系统对单个用户可打开文件数的默认值是1024虽然比较扛得住但为了避免极端情况下的Too many open files报错建议在~/.bashrc中追加ulimit -n 65536同时通过sysctl调大inotify的监控限制sudo sysctl -w fs.inotify.max_user_watches524288在Vivado中出现类似Failed to watch file之类的提示时通常就是因为inotify限制没调够。这个坑很多教程里都没有专门提过我在实战中遇到过几次添加限制后问题就消失了。5.4 内存压力的前期防御与swap策略我在前面提到swap不宜设置过大这里再次补充一个实践方案。如果你使用的是swapfile可以动态调整它的swappiness参数这个参数决定系统倾向于使用swap还是物理内存的程度默认值是60数值越小越倾向于使用物理内存。对于跑Vivado这种需要大量物理内存的场景我建议把swappiness设小一些sudo sysctl -w vm.swappiness10这个设置在系统重新启动后会恢复默认值为了永久生效需要写入sysctl.confecho vm.swappiness10 | sudo tee -a /etc/sysctl.conf同时对于运行Vivado期间的内存监控可以用htop或free -h实时查看内存使用情况。当你发现内存使用已经涨到物理内存容量的85%以上时就要警惕了要么关闭一些占用内存的浏览器标签页要么考虑增加物理内存。不要等到开始swap才行动那时候已经晚了。5.5 多线程与CPU调度的额外优化空间Linux下可以给Vivado指定CPU核数上限比如限制它使用物理核心而不是超线程核心避免超线程带来的性能下降问题。对于i7-10700这种8核16线程的CPU可以考虑只使用8个物理核心来运行Vivado的实现阶段taskset -c 0,1,2,3,4,5,6,7 vivado -mode batch -source run.tcl这个命令将Vivado进程绑定到前8个物理核心上运行。实际效果不同工程差异比较大需要自己测试一下。有的工程在启用超线程后布线的并行效率反而更高有的则完全相反。建议在跑大型工程之前用一个中等规模的测试工程做几次对比选择最优的绑定策略。5.6 驱动识别板子方向的常见问题硬件连接与权限这款软件在Linux下连接开发板时驱动权限是一个高频坑。Vivado在连接开发板时如果识别不到设备一般问题出在USB权限或者驱动没有正确加载。USB权限的问题可以通过添加udev规则来解决把当前用户加入dialout组sudo usermod -a -G dialout $USER然后重新登录一次让组权限生效。这个操作虽然不是万能的但解决了绝大部分无法识别板子的权限类问题。如果是驱动本身的问题需要先确认开发板对应的USB-JTAG适配器型号。例如如果你用的是Xilinx官方Platform Cable USB IILinux下通常会识别为FTDI芯片设备系统自带驱动即可正常工作。如果识别不到可以用dmesg查看内核日志中关于USB设备的输出根据报错信息来判断是电源问题、连线问题还是驱动问题。5.7 关于Implement Design变红的排查思路热搜词里出现了vivado implement design变红这个表述Linux环境同样会遇到这个问题。实现阶段失败的原因比综合阶段更复杂排查思路一般是先看综合后的资源利用率报告和时序约束报告确认RTL代码逻辑和约束没有问题再针对性地查看布线阶段的具体错误信息。在Linux下建议用batch模式运行实现流程这样可以更方便地把大规模日志输出保存到文件中vivado -mode batch -source implement.tcl implement_log.txt 21通过查看implement_log.txt的末尾阶段日志通常能看到具体的错误来源。常见的几种情况包括时序约束过紧导致布线失败、跨时钟域的路径未被正确约束、部分IP核配置错误导致实现资源冲突等。不要一上来就怀疑系统环境问题绝大多数情况下还是设计层面的原因。6. 一些值得尝试的进阶玩法命令行批处理模式与远程开发6.1 Tcl脚本驱动的批处理模式Vivado最强大的地方之一是它的Tcl脚本接口。在Linux下通过命令行模式跑流程不仅可以节省图形化界面占用的资源还更容易实现自动化。有了批处理模式就意味着你可以把综合、实现、生成比特流、生成报告等整个流程固化成脚本一键执行。下面是一个基础的批处理脚本流程保存在run.tcl中open_project /path/to/project.xpr reset_run synth_1 launch_runs synth_1 -jobs 8 wait_on_run synth_1 launch_runs impl_1 -to_step write_bitstream -jobs 8 wait_on_run impl_1 open_run impl_1 report_timing_summary -file timing_summary.rpt report_utilization -file utilization.rpt在终端中执行vivado -mode batch -source run.tcl这种方法的好处有很多可以批量跑多个配置参数的工程、可以自动收集报告文件、可以把重复性工作变成一键操作尤其是在需要反复修改参数做实验的场景下效率提升非常明显。6.2 远程开发环境下Linux的优势如果你有高性能服务器或者工作站远程跑Vivado综合和实现是一个很常见的场景。Linux在这个方向上比Windows有天然的优势因为通过SSH连接到Linux服务器后在本地用X2Go或VNC打开远程桌面或者干脆用纯命令行批处理模式都不会出现Windows Remote Desktop那种明显的卡顿感。我个人的习惯是在本地Windows机器上用编辑器写好RTL代码和Tcl脚本然后通过SSH推送到Linux服务器上跑批处理流程跑完后再把日志和比特流拉回来。这套流程熟练后比在本地打开Vivado GUI还快。对于需要长时间跑大型实现的场景这种方式可以完全释放本地电脑的使用压力。6.3 双系统文件共享的规范化建议对于双系统用户来说文件共享是一个必须考虑的问题。最常见的方式是给Windows和Linux分别划分不同的数据分区通过外部移动硬盘或局域网共享来交换文件。这种方式的优点是两边互不影响缺点是来回拷贝比较麻烦。如果更倾向于直接在同一台电脑上读取同一组文件可以在Linux下挂载NTFS分区时加上uid、gid参数来规避权限问题sudo mount -t ntfs-3g -o uid1000,gid1000,umask022 /dev/nvme0n1p3 /mnt/win_data但请注意我在前面已经明确建议过Vivado工程文件不要放在NTFS分区里直接跑工程。因为Vivado在工程运行时对各种文件的锁定、写入操作要求比较高NTFS在Linux下的性能和稳定性都不如ext4与其堵这个坑不如直接避开。在Windows下用Vivado打开Linux分区中的工程更不现实因为Windows不原生支持ext4。所以最稳妥的方案还是双系统各管各的工程副本或者用Git等版本管理工具来同步工程源码不包括生成的中间文件。7. 如果只有Windows机器这些小改造能缩小差距说了这么多Linux的优势如果因为各种原因比如公司规定只能用Windows或者个别第三方IP核不支持Linux版本你必须在Windows环境下跑Vivado以下这些系统层面的调整可以稍微缩小一点性能差距。这些方案我都实测过效果虽然没有切换到Linux那么明显但比什么都不做要强不少。第一关闭Windows Defender的实时保护。在病毒和威胁防护设置中找到实时保护关掉即可。Vivado工程目录是一个文件读写的重灾区Defender的实时扫描会持续拖慢文件I/O。这项操作不影响系统整体安全只要你别乱下载文件名不太对劲的软件包就行。第二把Windows电源计划切换到高性能或卓越性能然后进入高级电源设置把处理器最低状态设置为5%左右把处理器最大状态明确设置为100%。Windows默认在平衡电源计划下会让CPU频繁进入降频状态导致长时间的高负载任务性能波动明显。第三关闭Windows的快速启动功能。这个功能主要是为了加快开机速度但它会让关机时内核会话不完全关闭长期运行会积累系统资源占用问题。在电源选项中选择选择电源按钮功能然后点击更改当前不可用的设置把启用快速启动前面的勾去掉。第四如果你在Vivado运行过程中总觉得磁盘I/O有瓶颈可以检查一下是否安装了厂商提供的NVMe驱动以及是否开启了写缓存策略。虽然这些在Linux下是默认行为但在Windows下有些默认设置相对保守。8. 最后分享一点个人的真实感受把Vivado开发环境整体迁移到Linux之后我最直观的感受其实不只是性能提升而是整个开发体验的清爽感。没有了Windows后台的弹窗广告、自动更新重启、各类安全软件打扰注意力能更集中到RTL设计和时序收敛上。虽然Linux桌面环境在硬件驱动、办公软件生态、部分游戏支持上还是不如Windows方便但如果你绝大部分时间都在和FPGA工具链打交道Linux带来的效率和稳定性的提升是值得的。如果你现在还在犹豫要不要迁移我建议先从双系统的安装入手把基础环境搭建好然后用一个中等规模的非核心工程跑一遍完整流程看看耗时数据是否有变化。不要急着把主力工作环境直接切换过去先做好充分的验证再决定是否彻底迁移。
返回列表