cuNNQS-SCI:全GPU加速量子化学模拟框架的设计与实现

GPU加速量子化学模拟神经网络量子态
于 2026-05-31 03:12:23 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目概述:为什么我们需要一个全GPU加速的量子化学模拟框架?

在计算量子化学领域,我们这些从业者一直在与一个“指数级怪物”搏斗:求解多体系统的薛定谔方程。简单来说,如果你想精确计算一个分子(比如一个药物分子或一个催化剂)的电子结构、能量和性质,你需要处理所有电子在所有可能轨道上的排布方式。对于一个中等大小的分子,这种排布方式(我们称之为“电子组态”或“Slater行列式”)的数量会爆炸式增长,这就是所谓的“指数墙”。全配置相互作用(Full Configuration Interaction, FCI)方法在理论上可以给出最精确的解,但它需要枚举所有可能的组态,其计算量对于超过十几个电子的系统就变得不切实际,即使动用最强的超算也是如此。

过去几年,一个令人兴奋的交叉领域出现了:神经网络量子态(Neural Network Quantum States, NNQS)。其核心思想非常巧妙——我们不再显式地存储那个庞大到无法想象的波函数,而是用一个深度神经网络(比如Transformer)去学习并参数化它。你输入一个特定的电子组态(用一个比特串表示,比如011001代表哪些轨道被电子占据),神经网络就输出这个组态对应的波函数振幅。NNQS-SCI方法在此基础上更进一步,它结合了神经网络的高效表示和选择性配置相互作用(Selected CI, SCI)的精确筛选逻辑。SCI的精髓在于,并非所有组态对最终能量的贡献都同等重要,通常只有约1%的组态是关键的。NNQS-SCI通过迭代过程,用神经网络快速评估大量候选组态的振幅,只挑选出最重要的那些加入计算空间,从而以可控的成本逼近FCI精度。

这听起来很完美,对吧?但在实际部署中,我们遇到了硬骨头。现有的高性能NNQS-SCI实现采用了一种混合CPU-GPU架构。神经网络推理(前向和反向传播)这种“重活”确实扔给了GPU,但整个工作流中还有两个极其繁重且关键的“非AI”环节被留在了CPU上:耦合组态生成全局去重

让我给你拆解一下这其中的痛点。首先,全局去重。在每一轮迭代中,每个GPU会为当前重要的组态(SCI空间)生成所有可能的单、双电子激发态,这些新生成的候选组态在不同GPU之间、甚至同一GPU内部都会有大量重复。为了不给后续的神经网络推理增加无谓的负担,必须进行全局去重。基线方案的做法是,把所有GPU生成的候选组态全部收集到一个主CPU节点上,由它来统一去重。想象一下,当我们在64块GPU上模拟一个较大体系时,这个全局索引的大小可能达到数百GB。这不仅要求主节点有海量内存,更致命的是,所有GPU都要停下来,等待数据通过网络汇聚到CPU,去重完成后再分发回去。在我们的实测中,这个环节能吃掉总运行时间的30%以上,GPU利用率在此期间暴跌,整个集群的扩展性被这个单一的“交通枢纽”彻底卡死。

其次,耦合组态生成。这个步骤是根据量子力学中的Slater-Condon规则,为每个源组态生成所有可能与之有非零矩阵元(即哈密顿量矩阵非零)的耦合组态。在基线实现中,这个计算量巨大的任务也是在CPU上串行完成的。随着GPU数量增加,神经网络推理部分可以很好地并行扩展,但这个CPU任务却成了拖后腿的短板。它的计算时间甚至会开始超过GPU推理时间,导致宝贵的GPU资源长时间空闲,等待CPU喂数据。频繁的CPU-GPU数据传输也带来了可观的PCIe开销。

所以,问题的核心就变成了:能否将整个SCI工作流,包括这些“非AI”的繁重任务,全部搬到GPU上执行? 这就是cuNNQS-SCI框架要回答的问题。它的目标不是改进算法理论,而是进行一场彻底的“系统级”重构,移除CPU端的性能枷锁,构建一个真正以GPU为中心、能极致发挥现代算力集群潜力的执行引擎。这对于推动NNQS-SCI方法应用于更真实、更复杂的大分子体系至关重要。

2. 核心架构设计:从混合到全GPU的范式迁移

cuNNQS-SCI的设计哲学非常明确:让GPU做所有它擅长的事,并且让它们一起高效地做。这不仅仅是写几个CUDA内核那么简单,它涉及到底层算法、数据布局、通信模式和内存管理范式的全面重新设计。整个框架的迭代流程遵循经典的“迭代-扩展-推理-选择-优化”循环,但每个环节的实现都经过了GPU原生化的改造。

2.1 整体数据流与阶段划分

为了打破CPU瓶颈,cuNNQS-SCI将工作流重新组织为三个以GPU为核心、流水线化的阶段,如下图所示(注:此处为概念描述,非实际图表):

第一阶段:大规模并行生成与全局去重(对应痛点❶和❷) 这是性能提升的关键。每个GPU独立地为其分配到的源组态,调用我们精心设计的专用CUDA内核,并行生成所有耦合候选组态。生成后,立即在GPU内部进行一次快速的本地去重,过滤掉块内重复项。然后,所有GPU协同执行一个分布式的、基于排序的全局去重算法。这个算法避免了将所有数据汇聚到单一节点,而是通过全局排序和规则采样,让每个GPU负责处理全局数据的一个均匀切片,并在本地完成最终的去重。去重后的、全局唯一的候选组态列表是下一阶段神经网络的输入。

第二阶段:批处理推理与分层选择 全局唯一的候选组态集可能非常庞大,无法一次性装入GPU内存进行推理。因此,cuNNQS-SCI采用了一种流式处理策略。候选组态被分成一个个“迷你批次”(mini-batch),从主机内存异步流式传输到GPU。对于每个批次,预训练的NNQS-Transformer模型评估每个组态的波函数振幅(一个复数)。为了控制内存并筛选出最重要的组态以扩展SCI空间,框架采用了两级分层Top-K选择策略:先在每个批次内进行局部Top-K筛选,再将各批次的优胜者合并进行全局Top-K筛选。

第三阶段:能量计算与网络优化 利用第一阶段保存的索引映射关系,将推理得到的波函数振幅重新映射回原始的、非唯一的组态空间(即每个源组态对应的所有耦合组态)。然后,基于这些振幅和预先计算的哈密顿量矩阵元(同样存储在GPU上),精确计算每个组态对局部能量的贡献。最后,通过规约操作得到全局能量估计,并以此计算损失,通过反向传播更新神经网络参数。同时,第二阶段选出的Top-K新组态被合并到SCI空间中,用于下一轮迭代。

这个设计最精妙的地方在于,它将原本在CPU上串行且构成瓶颈的两个最重任务——耦合组态生成和全局去重——彻底迁移到了GPU上,并且让它们以高度并行的方式执行。同时,通过流式处理和重叠计算/传输,巧妙地绕过了单GPU内存容量的限制。最终,性能瓶颈被重新转移到了它本该在的地方:设备端的神经网络推理算力。这才是我们堆砌GPU想要解决的真正问题。

2.2 直面三大挑战的设计决策

cuNNQS-SCI的架构直接瞄准了之前提到的三个核心挑战:

  1. 挑战一:扩展性壁垒——集中式CPU去重。解决方案是分布式、基于排序的全局去重算法(详见第4.1节)。其核心是用确定性的、基于数据量的划分替代可能造成负载不均的哈希划分,确保每个GPU获得几乎相等的工作量,同时将网络通信量最小化。

  2. 挑战二:计算瓶颈——CPU端的耦合组态生成。解决方案是专为GPU设计的高性能内核与压缩数据布局(详见第4.2节)。我们将生成任务转化为一个适合GPU大规模并行处理的“每个线程处理多个虚拟激发”的细粒度模型,并设计了极度压缩的“激发表”来存储哈密顿量信息,使得内存占用从“不可能”变为“可能”。

  3. 挑战三:容量限制——GPU内存墙。解决方案是以GPU内存为中心的运行时范式(详见第4.3节)。通过精细的依赖分析,将工作流划分为必须同步的阶段,在阶段内部采用迷你批处理来限制峰值内存使用,并利用CUDA流和异步操作重叠计算与数据传输,从而让计算任务在有限的设备内存中“流动”起来,模拟远超单GPU内存容量的大型系统。

3. 关键技术实现深度解析

3.1 分布式全局去重:从集中式哈希到分布式排序

全局去重的目标是,给定分布在N个GPU上的候选组态列表,产生一个全局唯一的列表,并均匀地重新分布到所有GPU上,为后续的并行推理做准备。基线方案的集中式哈希表法在扩展性上的失败,根本原因在于其通信模式(All-Gather到主节点)和内存需求。

我们的设计基于一个关键观察:量子组态数据是密集的整数(比特掩码),天然适合排序而非哈希。哈希在GPU上性能不佳,因为处理冲突需要原子操作(如atomicCAS),这会导致严重的线程发散和串行化,破坏GPU最擅长的合并内存访问模式。而排序,特别是基数排序(Radix Sort),在GPU上已经是非常成熟且高度优化的操作。

算法三步走:

  1. 本地排序与采样:每个GPU首先使用高性能的基数排序对本地生成的候选组态进行排序。然后,我们从排序后的数组中等间隔采样(例如,每隔N/S个元素采一个样),得到一组本地采样点。这些采样点的数量很少(P * S,P是GPU数量,S是采样率),它们构成了全局数据分布的一个轻量级“素描”。

  2. 全局划分决策:一个根GPU(可以是任意一个)收集所有GPU的本地采样点,将它们合并并排序。基于这个排序后的全局采样点数组,我们可以计算出P-1个“分割点”(splitters),这些分割点将整个全局数据范围均匀地划分为P个区间。这些分割点被广播回所有GPU。

  3. All-to-All交换与本地合并:每个GPU根据收到的全局分割点,通过二分查找确定自己本地排序数组中哪些数据属于哪个目标区间(即哪个GPU)。然后,执行一个MPI_Alltoallv操作,每个GPU将自己负责的每个数据块直接发送到对应的目标GPU。接收方GPU会收到来自所有GPU的、属于自己区间的数据块。由于这些数据在发送前已经局部有序,且全局划分是基于排序的,因此接收方只需要对这些有序的数据块进行一次多路归并,并在归并过程中轻松剔除相邻的重复项(重复项只可能出现在本地数据块内部或不同数据块的边界处),即可得到最终全局唯一且已排序的、属于自己的那部分数据。

为什么这样设计?

  • 负载均衡:基于排序的规则采样保证了每个GPU最终获得的数据量大致相等,避免了哈希可能导致的“数据倾斜”和“热点”问题。无论原始数据分布如何,最终划分都是均匀的。
  • 通信高效MPI_Alltoallv是一种集体通信操作,在现代高速互联网络上非常高效。更重要的是,大多数重复项在本地排序和后续的本地合并阶段就被消除了,无需通过网络传输,极大地减少了通信总量。
  • GPU友好:整个流程的核心操作(排序、二分查找、归并)都是GPU擅长的高度规整、数据并行的操作,没有难以并行的原子操作或随机内存访问。

实操心得:在实现这个分布式排序去重时,采样率S的选择是个权衡。太小的S可能导致对数据分布估计不准,影响负载均衡;太大的S会增加采样集合的通信和排序开销。我们的经验是,设置S使得每个GPU的采样点总数在几千到一万左右,通常就能很好地反映分布,其开销相对于动辄数GB的组态数据来说微乎其微。

3.2 耦合组态生成的GPU内核:在内存与计算间走钢丝

将耦合组态生成移到GPU,最大的挑战是内存占用。最直观的想法是为每个源组态预分配一个固定大小的输出数组,用来存储它所有可能的耦合组态。但这样做的内存消耗是灾难性的。对于一个有n个电子的组态,可能的双激发数量是O(n^2 * m^2),其中m是轨道数。对于中等体系,这个中间数组的大小会迅速撑爆GPU的显存。

因此,我们的内核设计必须极度节俭。核心思路是**“计算即生成,即时过滤”**,避免任何形式的中间膨胀。

压缩数据布局:激发表 我们不存储庞大的哈密顿量矩阵,而是依据Slater-Condon规则,预先计算好两个小的查找表:单激发表双激发表。以双激发表为例,对于任意一对占据轨道(i, j),表中存储了所有可能跃迁到的空轨道对(a, b)的索引,以及对应的哈密顿量矩阵元H_{ij,ab}。由于不是所有跃迁都是允许的(矩阵元可能为零),我们将所有有效跃迁的列表填充(pad)到统一长度,形成一个规整的二维数组。这种压缩是激进的,例如对于N2分子,原本需要艾字节(10^18字节)存储的矩阵信息,被压缩到了不足400KB的表中。代价是,内核在读取这些表时,访问模式是间接的(gather),不利于缓存,但我们认为这是为了将任务留在GPU上必须接受的权衡。

细粒度内核架构 内核采用两层并行结构:

  • 网格级:一个GPU线程块(Block)负责处理一个或多个源组态。我们将同一个源组态所需的数据(如占据轨道列表)加载到快速的共享内存(Shared Memory)中,供块内所有线程共享。
  • 块级:每个线程负责处理该源组态对应的多个可能的激发。我们定义一个“虚拟线程ID”空间,覆盖该源组态所有可能的单、双激发。每个物理线程在一个循环中处理多个虚拟线程。

执行流程(以双激发为例)

  1. 线程根据其虚拟ID,解码出它负责处理的是哪一对占据轨道(i, j),以及目标激发在表中的索引。
  2. 线程通过一次间接内存访问,从双激发表中读取对应的哈密顿量矩阵元H_element
  3. 关键筛选:如果|H_element| > ε(ε是一个接近零的阈值,用于过滤数值上可忽略的相互作用),则该激发是有效的。
  4. 对于有效激发,线程通过几次高效的位运算(XOR和AND),在寄存器中即时生成新的组态比特串。
  5. 线程将生成的新组态和对应的H_element写入块内的共享内存临时缓冲区。

高效流压缩(Stream Compaction) 由于只有一小部分激发是有效的,我们需要将有效结果紧凑地写入全局内存。我们在共享内存中维护一个valid_mask数组。每个线程在计算后,如果结果有效,就在valid_mask对应位置标记1。然后,块内所有线程协作进行一次并行前缀和(Prefix Sum)扫描。这个扫描为每个有效结果计算出一个在块内唯一的、连续的输出索引。最后,整个线程块执行一次合并的(coalesced)写入操作,将所有有效结果一次性从共享内存拷贝到全局内存的相应位置。每个块只需使用一次atomicAdd操作,在全局内存中预留出自己所需的空间。

注意事项:这个内核是内存带宽受限型的,而非计算受限型。性能瓶颈主要在于从全局内存中随机访问(gather)激发表。因此,确保激发表尽可能小,并且常驻在GPU的L2缓存或只读缓存中,对性能至关重要。我们使用了CUDA的__ldg()指令来优化对只读数据的访问。

3.3 以GPU内存为中心的运行时:让大问题在有限内存中“流动”

即使优化了内核,当模拟的体系非常大时,单次迭代产生的唯一候选组态集合仍然可能超过单块GPU的内存容量。我们不能让这个问题阻止计算。我们的策略是:将GPU内存视为缓存,将计算分解为可管理的迷你批次,并通过流水线隐藏数据移动开销

依赖分析与阶段划分 首先,我们必须识别工作流中哪些步骤存在严格的全局依赖,必须同步。在cuNNQS-SCI中,有两个这样的“屏障”:

  1. 全局去重屏障:必须等到所有GPU生成的所有候选组态都就绪,才能开始全局去重操作。在这之前,我们无法知道哪些是唯一的。
  2. 全局Top-K选择屏障:必须等到所有迷你批次的神经网络推理完成,并汇总了所有局部的Top-K结果,才能确定全局最重要的K个组态。

这两个屏障自然地将工作流分成了三个阶段(如2.1节所述)。阶段内部(例如,处理一个迷你批次内的所有组态)是没有依赖的,可以流式进行。

迷你批处理与重叠执行

  1. 流式生成与去重:在阶段1,我们并不要求一次性将所有源组态的耦合组态全部生成并去重。我们可以将源组态列表分成多个批次。对于一个批次,GPU生成耦合组态,进行本地去重,然后异步地将中间结果卸载(offload)到主机内存。同时,GPU可以立即开始处理下一个批次。这样,峰值内存占用就被限制在一个批次的大小,而不是整个数据集的大小。
  2. 异步推理:在阶段2,全局唯一的候选组态列表存储在主机内存中。我们创建多个CUDA流(Stream)。一个流负责将下一个迷你批次的组态数据从主机拷贝到GPU(cudaMemcpyAsync),而另一个流则在GPU上执行当前批次的神经网络推理。当推理完成时,结果被异步拷贝回主机。通过这种方式,数据传输和GPU计算得以重叠,有效隐藏了PCIe延迟。
  3. 双缓冲与动态调度:更高级的优化是使用双缓冲技术。我们分配两块GPU内存缓冲区。当一块缓冲区在进行推理计算时,另一块可以同时接收来自主机的下一批数据。计算和传输完全并行。

内存中心执行模型 整个运行时系统围绕GPU内存容量进行调度。它会根据当前可用的GPU内存,动态决定每个迷你批次的最大尺寸。如果遇到一个特别大的数据块(比如一次去重后产生的巨大唯一列表),运行时会自动将其切片,分多次进行处理。其原则是:永远不要让任何一个操作步骤所需的内存超过GPU可用内存,通过流式处理将大任务化整为零。

踩坑实录:早期实现中,我们忽略了CUDA内核启动、内存拷贝和计算之间的依赖关系,导致流水线经常停滞。后来我们严格使用CUDA事件(cudaEvent_t)来记录每个流中关键操作(如内核完成、拷贝完成)的时刻,并在流之间建立正确的事件等待关系(cudaStreamWaitEvent)。这是实现稳定、高效重叠计算的关键。

4. 性能评估与实战启示

我们在一套由8个节点、每个节点配备8块NVIDIA A100 GPU(共64块GPU)的集群上对cuNNQS-SCI进行了测试,并与高度优化的基线NNQS-SCI实现进行对比。测试体系包括从N2、Cr2到更大的一些过渡金属络合物。

性能结果

  1. 端到端加速:对于具有挑战性的体系,cuNNQS-SCI实现了最高2.32倍的端到端加速。这意味着以前需要跑一天的计算,现在可能只需要10个小时。加速主要来源于完全消除了CPU端的去重和生成瓶颈,以及更高效的内存访问和通信模式。
  2. 强扩展性:在强扩展测试中(固定问题规模,增加GPU数量),cuNNQS-SCI在64 GPU时仍能保持超过90% 的并行效率。相比之下,基线方案由于集中式去重的通信瓶颈,在64 GPU时效率已降至66%左右。这证明我们的分布式去重算法有效地解决了扩展性问题。
  3. 瓶颈转移:性能剖析显示,在cuNNQS-SCI中,神经网络Transformer模型的推理时间占总运行时间的比例从基线的~50%上升到了~80%。这正符合我们的设计目标——将瓶颈重新转移到了GPU的计算能力上,让昂贵的GPU算力真正被用于解决核心的科学计算问题,而不是在等待CPU或数据传输。

对从业者的启示

  1. “全GPU化”是趋势,但需系统设计:cuNNQS-SCI的成功表明,将科学计算工作流中所有计算密集的部分迁移到GPU是可行的,并且能带来巨大收益。但这不仅仅是移植代码,更需要根据GPU的架构特性(大规模并行、内存层次、高带宽)重新设计算法和数据结构。
  2. 通信与计算模式必须匹配硬件:对于分布式GPU应用,应尽量避免All-to-One或One-to-All的通信模式。像All-to-All这样的对等通信模式,结合基于数据量的确定性负载划分(如排序采样),能更好地利用现代高速网络(如NVLink, InfiniBand)的带宽。
  3. 内存管理是GPU编程的核心:面对“内存墙”,程序员必须有“流式”和“缓存”的思维。主动管理数据在主机-设备间的移动,利用异步操作和流水线隐藏延迟,是处理超出设备内存的大规模问题的关键技术。
  4. 性能剖析至关重要:在优化过程中,我们重度依赖Nsight Compute和Nsight Systems这类性能剖析工具。它们帮助我们发现最初的性能瓶颈不在计算内核,而是在内存拷贝和同步等待上,从而指引我们转向了以内存为中心和重叠执行的优化方向。

5. 常见问题与排查技巧实录

在实际部署和调试cuNNQS-SCI这类复杂的高性能计算框架时,会遇到各种各样的问题。以下是一些典型问题及其解决思路:

Q1: 分布式去重后,各GPU持有的数据量严重不均衡,导致某些GPU先完成,其他GPU在等待。

  • 排查:这通常是负载均衡算法出了问题。首先检查规则采样算法是否正确。确保每个GPU在本地排序后,采样点的选取是等间隔的,并且所有GPU使用的采样间隔公式一致。其次,检查根节点在收集所有采样点、排序并计算分割点时,是否正确地计算出了P-1个能均匀划分全局数据的分割点。
  • 技巧:可以在算法执行后,输出每个GPU接收到的数据量统计。在测试阶段,使用一个小的、可预测的数据集(如连续整数)来验证负载均衡是否完美。如果在小数据上均衡,在大数据上不均衡,可能是由于数据本身分布极度不均匀,但基于排序的采样方法应对此有鲁棒性,需检查边界条件处理(如重复值恰好落在分割点边界上)。

Q2: 耦合组态生成内核的运行时异常(如非法内存访问、核函数超时)。

  • 排查
    • 内存访问:最常见的原因是激发表(T_single, T_double)的索引越界。确保虚拟ID到(i, j, a, b)索引的解码函数DecomposeVirtualID在所有边界情况下都正确。特别是当max_single_sizemax_double_size是填充后的值时,访问表元素前要检查原始的有效长度。
    • 共享内存:检查声明的共享内存大小BLOCK_SIZE是否与内核启动配置中的线程块大小匹配,并且不超过设备的共享内存限制。
    • 原子操作:全局计数器g_counter需要使用atomicAdd进行安全的累加。确保其指针在内核启动前已在设备上分配并初始化为0。
  • 技巧:使用cuda-memcheck工具来检测内存访问错误。对于复杂的索引计算,可以在CPU上写一个简单的验证程序,对小规模输入运行GPU内核和CPU参考实现,逐项对比输出结果。

Q3: 流水线执行效率低下,GPU利用率波动大,经常出现“断流”。

  • 排查:使用nvprof或Nsight Systems进行时间线可视化分析。查看CUDA流的时间线,检查是否存在以下问题:
    • 计算与传输未重叠:可能是主机端内存页未锁定(pinned),导致cudaMemcpyAsync退化为同步拷贝。确保用于异步拷贝的主机内存是通过cudaMallocHost分配的锁页内存。
    • 依赖管理错误:计算内核可能错误地依赖了尚未完成的数据传输事件。仔细检查cudaStreamWaitEvent的调用位置,确保事件是在正确的流中记录的。
    • 迷你批次大小不合适:批次太小,内核启动和拷贝的开销占比过高;批次太大,会导致内存占用高,且可能无法充分利用流水线。需要根据具体问题和GPU内存容量进行调优。
  • 技巧:建立一个简单的性能模型。分别测量内核计算时间、主机到设备拷贝时间、设备到主机拷贝时间。理想情况下,计算时间应略大于拷贝时间,这样才能完全隐藏拷贝开销。通过调整迷你批次大小,使计算和拷贝时间达到平衡。

Q4: 最终计算得到的能量值与基线CPU结果或已知参考值有微小偏差。

  • 排查:这通常是数值精度或非确定性操作导致的。
    • 排序稳定性:GPU基数排序在不同运行间或不同GPU间,对于重复值的排序顺序可能不是确定性的。这可能导致全局去重后,组态分配到不同GPU的分布有细微差别。虽然最终唯一集是相同的,但分布不同可能影响后续并行求和(如能量计算)的浮点数累加顺序,由于浮点运算的非结合性,会导致最后几位有效数字的差异。
    • 阈值处理:筛选矩阵元时使用的阈值ε是否与基线完全一致?一个极小的差异可能导致筛选掉的组态不同。
    • 随机数种子:如果工作流中任何地方涉及随机性(如神经网络参数初始化,如果包含),必须确保所有运行使用相同的种子。
  • 技巧:对于调试,可以关闭所有并行和优化,在单GPU、单线程下运行一个最小算例,与经过验证的CPU结果逐位比较。一旦单GPU结果正确,再逐步开启并行功能,定位引入差异的步骤。对于生产运行,可以评估这种非确定性带来的能量差异是否在化学精度(通常~1 kcal/mol)允许范围内。如果要求完全确定性,可能需要使用确定性的并行排序算法和规约操作,但这往往会牺牲一些性能。

cuNNQS-SCI框架的构建是一个典型的跨层优化案例,它要求开发者同时理解上层的量子化学算法、中层的并行计算模式以及底层的GPU硬件架构。通过将整个工作流彻底GPU化并精心设计每个环节,我们不仅获得了显著的性能提升,更重要的是,为NNQS-SCI方法探索更大、更真实的化学体系扫清了系统层面的障碍。这套以GPU内存为中心、融合了高效通信和细粒度计算的设计思路,对于其他面临类似“内存墙”和“通信墙”的大规模科学计算应用,也具有广泛的借鉴意义。