[{"data":1,"prerenderedAt":307},["ShallowReactive",2],{"content-query-ugBU8vQWuu":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"cover":11,"type":12,"category":13,"body":14,"_type":301,"_id":302,"_source":303,"_file":304,"_stem":305,"_extension":306},"/technology-blogs/zh/3559","zh",false,"","开源之夏系列 | 提升MindSpore Quantum中Stabilizer模拟器性能","开源之夏，是由中国科学院软件研究所发起，专为高校学生精心打造的活动。旨在鼓励广大学子积极参与开源软件的开发与维护，推动优秀开源软件社区的蓬勃发展。","2024-12-25","https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2025/01/08/3cc2b154c3a94a3daab34942e241d6a0.png","technology-blogs","实践",{"type":15,"children":16,"toc":296},"root",[17,25,30,35,43,52,57,62,75,80,92,100,105,113,118,123,128,136,141,145,153,161,166,173,178,186,194,199,206,214,222,227,235,240,247,252,259,264,271,276,283,291],{"type":18,"tag":19,"props":20,"children":22},"element","h1",{"id":21},"开源之夏系列-提升mindspore-quantum中stabilizer模拟器性能",[23],{"type":24,"value":8},"text",{"type":18,"tag":26,"props":27,"children":28},"p",{},[29],{"type":24,"value":9},{"type":18,"tag":26,"props":31,"children":32},{},[33],{"type":24,"value":34},"目前，开源之夏2024已圆满结项！在本届开源之夏中，不少开发者跟随昇思MindSpore一起，在开源的世界里畅游，成功完成项目任务。在此，昇思 MindSpore 开源社区邀请了开源之夏的开发者们，分享他们在本次活动中的宝贵经验与心得。我们希望通过这些精彩的项目经历和实战技巧，能够激发更多创意火花，帮助大家提升技术能力。本文为昇思MindSpore 开源之夏项目经验分享系列第5篇。",{"type":18,"tag":26,"props":36,"children":37},{},[38],{"type":18,"tag":39,"props":40,"children":42},"img",{"alt":7,"src":41},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/b9ac812dd2814fd19dda46ab27060204.png",[],{"type":18,"tag":26,"props":44,"children":45},{},[46],{"type":18,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":24,"value":51},"项目基本介绍",{"type":18,"tag":26,"props":53,"children":54},{},[55],{"type":24,"value":56},"1、项目名称：提升MindSpore Quantum中Stabilizer模拟器性能",{"type":18,"tag":26,"props":58,"children":59},{},[60],{"type":24,"value":61},"2、项目导师：杨金元",{"type":18,"tag":26,"props":63,"children":64},{},[65,67],{"type":24,"value":66},"3、项目链接：",{"type":18,"tag":68,"props":69,"children":73},"a",{"href":70,"rel":71},"https://summer-ospp.ac.cn/org/prodetail/24c6d0467?list=org&navpage=org",[72],"nofollow",[74],{"type":24,"value":70},{"type":18,"tag":26,"props":76,"children":77},{},[78],{"type":24,"value":79},"4、项目描述：Minspore Quantum运行的基本原理是使用矩阵计算让经典计算机去模拟量子计算机，目前框架已使用Python实现几个常用的量子模拟器，但存在效率不高的问题，无法满足量子模拟的实际需求。项目内容是使用C++实现一个Stabilizer模拟器，并探索实现改进Stabilizer模拟器性能的方法，以用来满足大比特场景下复杂量子计算。同时，对改进Stabilizer模拟器性能与Mindspore Quantum 现有的模拟器性能进行基准测试，验证其高效性能。",{"type":18,"tag":26,"props":81,"children":82},{},[83,85],{"type":24,"value":84},"项目代码：",{"type":18,"tag":68,"props":86,"children":89},{"href":87,"rel":88},"https://gitee.com/mindspore/mindquantum/tree/research/summer%5C_ospp/2024/24c6d0467",[72],[90],{"type":24,"value":91},"https://gitee.com/mindspore/mindquantum/tree/research/summer\\_ospp/2024/24c6d0467",{"type":18,"tag":26,"props":93,"children":94},{},[95],{"type":18,"tag":47,"props":96,"children":97},{},[98],{"type":24,"value":99},"项目选择初衷",{"type":18,"tag":26,"props":101,"children":102},{},[103],{"type":24,"value":104},"在本科的时候，经过同学介绍，参与过一次开源之夏，当时负责的是ElasticSearch数据库增删改查接口的实现，项目难度为基础，编程语言为Java。在经过实验室科研训练和参加算法编程竞赛后，我发现自己相较于Java面向业务端的开发内容，更喜欢底层模块开发以及更具有挑战性的算法优化与实现。正又值开源之夏申请季，我在浏览了众多项目后，与杨金元导师简单沟通，了解到量子计算与量子模拟的相关内容，发现项目内容十分富有挑战性。MindSpore作为国内顶尖AI开源框架，我认为这是近距离接触前沿技术的良好契机，抱着试一试的态度，投递了项目申请书。在杨金元导师的悉心指导下，我成功中选并着手进行项目开发。",{"type":18,"tag":26,"props":106,"children":107},{},[108],{"type":18,"tag":47,"props":109,"children":110},{},[111],{"type":24,"value":112},"项目方案介绍",{"type":18,"tag":26,"props":114,"children":115},{},[116],{"type":24,"value":117},"目前MindSpore Quantum中已有python实现的基于stabilizer tableau模拟器，但由于python自身的运行效率较低，无法满足1000大比特的实现，无法满足功能模拟。同时，根据参考文献，目前有一种改进的Stabilizer Tableau模拟器。至此，项目的开发内容就比较明确：",{"type":18,"tag":26,"props":119,"children":120},{},[121],{"type":24,"value":122},"1、完成Stabilizer Tableau的C++重构",{"type":18,"tag":26,"props":124,"children":125},{},[126],{"type":24,"value":127},"2、实现改进Stabilizer Tableau模拟器的创新点，分别为 1). Inverse Tableau. 2). Vectorized Code",{"type":18,"tag":26,"props":129,"children":130},{},[131],{"type":18,"tag":47,"props":132,"children":133},{},[134],{"type":24,"value":135},"项目实现思路",{"type":18,"tag":26,"props":137,"children":138},{},[139],{"type":24,"value":140},"我将从原理解析和程序设计两个方面来介绍项目的实现思路。",{"type":18,"tag":142,"props":143,"children":144},"h2",{"id":7},[],{"type":18,"tag":26,"props":146,"children":147},{},[148],{"type":18,"tag":47,"props":149,"children":150},{},[151],{"type":24,"value":152},"01",{"type":18,"tag":26,"props":154,"children":155},{},[156],{"type":18,"tag":47,"props":157,"children":158},{},[159],{"type":24,"value":160},"原理解析",{"type":18,"tag":26,"props":162,"children":163},{},[164],{"type":24,"value":165},"- Inverse Tableau 优化 Stabilizer Tableau",{"type":18,"tag":26,"props":167,"children":168},{},[169],{"type":18,"tag":39,"props":170,"children":172},{"alt":7,"src":171},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/012a14dc9e5744ee89b314923a94f1e9.png",[],{"type":18,"tag":26,"props":174,"children":175},{},[176],{"type":24,"value":177},"Mindspore Quantum现有基于Python实现的Stabilizer模拟器，参考的是CHP算法，时间复杂度为O(n^2)。根据参考文献，取消Clifford门与Tableau的计算，通过追踪Clifford门的逆，在最后进行量子测量的时候，判断量子态是否为确定态，确定态即可直接得到测量结果（复杂度降到线性O(1)），非确定态再进行测量。",{"type":18,"tag":26,"props":179,"children":180},{},[181],{"type":18,"tag":47,"props":182,"children":183},{},[184],{"type":24,"value":185},"02",{"type":18,"tag":26,"props":187,"children":188},{},[189],{"type":18,"tag":47,"props":190,"children":191},{},[192],{"type":24,"value":193},"Vectorized Code 向量化计算",{"type":18,"tag":26,"props":195,"children":196},{},[197],{"type":24,"value":198},"以H门为例，H^-1与tableau的计算，是Xq与Zq整行进行交换。其他大部分的量子逻辑门逆都是整行计算，现有的矩阵向量计算方案多为逐个元素计算，单线程操作，效率低下，面对量子比特大，量子电路复杂的情况，表现十分差。因此，采用SIMD指令优化加速计算过程，并行操作。",{"type":18,"tag":26,"props":200,"children":201},{},[202],{"type":18,"tag":39,"props":203,"children":205},{"alt":7,"src":204},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/1fb45202ae284cf1b8cd41c927920d79.png",[],{"type":18,"tag":26,"props":207,"children":208},{},[209],{"type":18,"tag":47,"props":210,"children":211},{},[212],{"type":24,"value":213},"03",{"type":18,"tag":26,"props":215,"children":216},{},[217],{"type":18,"tag":47,"props":218,"children":219},{},[220],{"type":24,"value":221},"程序设计",{"type":18,"tag":26,"props":223,"children":224},{},[225],{"type":24,"value":226},"核心的数据结构是Tableau的设计，所有的操作实际上是针对Tableau 模拟。一个Tableau从数据结构的角度来理解，由X、Z、Phase三部分组成，是一个值全为0/1的二维矩阵，大小为(2n+1)*2n，n系统的量子比特数。其中X、Z大小为n*2n，Phase大小为n*1。如果用常用的数据类型(例如int类型)构建一个二维数组对Tableau进行存储，会造成存储空间的巨大浪费（值只有0/1，一个int类型消耗1byte的内存），并且计算效率低下（单线程）。针对存储空间优化，每个元素实际上只需要1bit的内存。针对计算效率优化，在原理解析已经介绍了SIMD指令多线程加速计算。在C++中，SIMD指令有相关的头文件（Linux系统下是）封装了相关数据类型及基本操作。",{"type":18,"tag":26,"props":228,"children":229},{},[230],{"type":18,"tag":47,"props":231,"children":232},{},[233],{"type":24,"value":234},"最终方案",{"type":18,"tag":26,"props":236,"children":237},{},[238],{"type":24,"value":239},"SIMD指令加速方面，头文件中，支持不同类型的SIMD指令，我使用了256位AVX指令，也就意味着一次对256位的数据进行计算，使用m256i类型创建变量，每一位存储Tableau的一个值(0/1)。这里，我将m256i变量和基础位运算操作简单封装为SIMDWord类，Tableau存储到多个SIMDWord中。又因为调用一次SIMD指令最小操作单位为256位，因此需要对不足256的数据进行补全。",{"type":18,"tag":26,"props":241,"children":242},{},[243],{"type":18,"tag":39,"props":244,"children":246},{"alt":7,"src":245},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/d6c500783b3749ef8f4f97b6e5f39055.png",[],{"type":18,"tag":26,"props":248,"children":249},{},[250],{"type":24,"value":251},"Tableau与量子逻辑门计算通过操作SIMDWord位运算实现。观察不同量子门的计算发现，一共有两种，对X或者Z行/列计算、逐位计算。因此，Tableau需要支持按行查询一整行该数据，同时支持按行按列查询该位存储数据，类似一个二维数据。针对以上需求，我封装了SIMDTable类、SIMDArray类，通过重载[]运算符，支持按行查询，返回结果为SIMDArray类。SIMDArray类中重载[]运算符，返回结果为SIMDWord中一个bit。",{"type":18,"tag":26,"props":253,"children":254},{},[255],{"type":18,"tag":39,"props":256,"children":258},{"alt":7,"src":257},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/30eb0d6e89034bc1a8cc79a9e0b88ded.png",[],{"type":18,"tag":26,"props":260,"children":261},{},[262],{"type":24,"value":263},"在梳理完需求后，剩下的工作内容就是代码复现和完善程序设计，值得一提的就是内存管理部分的优化设计，这也是由C++语言特性决定的。在初版代码中，由于理解不到位，我把内存的申请与内存的释放写在了SimdTable、SimdArray的析构函数中，但SIMDTable是一个中间变量，会多次调用，是根据SimdWord生成，这样会存在Tableau还需要运算，SIMDWord申请的内存已经释放的情况，导致内存泄漏。所以，内存申请释放应该写在Tableau的构造函数中，然后在Tableau中实现对XTable、ZTable、Phase的查询。",{"type":18,"tag":26,"props":265,"children":266},{},[267],{"type":18,"tag":39,"props":268,"children":270},{"alt":7,"src":269},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/9bd46245f13149d694f1c9d6fedde77e.png",[],{"type":18,"tag":26,"props":272,"children":273},{},[274],{"type":24,"value":275},"最后，我使用GTest框架，对以上提到的项目几个类中实现的方法，以及简单的量子逻辑门计算进行了单元测试，另外也编写了基准测试代码，评价时间效率，结果表明，通过优化后的模拟器，效率比MqVector提高了50%。",{"type":18,"tag":26,"props":277,"children":278},{},[279],{"type":18,"tag":39,"props":280,"children":282},{"alt":7,"src":281},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2024/12/27/125c112ee91e4f91a760ec551983cd89.png",[],{"type":18,"tag":26,"props":284,"children":285},{},[286],{"type":18,"tag":47,"props":287,"children":288},{},[289],{"type":24,"value":290},"项目总结",{"type":18,"tag":26,"props":292,"children":293},{},[294],{"type":24,"value":295},"回顾整个项目开发过程，60%的时间在了解量子计算与Stabilizer模拟器相关的基础知识，因为我是初次接触量子力学，这也是最具有挑战的部分，在这个过程中，杨金元导师给我的鼓励和支持，并且耐心地为我解答相关知识。这次项目开发极大地锻炼了我独立解决问题、思考的能力，将理论问题抽象成程序设计并实现。经过这次开发，我意识到一个项目的开发是需要经历多次版本迭代，并不可能一次就完成，项目的完成更需要的是面对一次次报错的耐心和坚持。最后，再次感谢昇思提供的这次机会，让我了解开源，爱上开源。",{"title":7,"searchDepth":297,"depth":297,"links":298},4,[299],{"id":7,"depth":300,"text":7},2,"markdown","content:technology-blogs:zh:3559.md","content","technology-blogs/zh/3559.md","technology-blogs/zh/3559","md",1776506130996]