这是本文档旧的修订版!
在本教程中,您将学习用于提高各种系统 ATK 性能而需要调整的主要参数。为了获得尽可能高的计算性能,ATK 提供了一系列不同的算法,并利用 MPI 和共享内存线程进行并行。正如技术说明 Parallelization of QuantumATK calculations 中已经提到的,MPI 并行通常会提供最佳的计算加速,而进程的线程化通常可以减少内存占用。
要获得任何高性能软件的绝对最佳性能,需要对所涉及的计算和使用的硬件有一定的深入了解。因此,对于使用的硬件和并行方法,优化您的 QuantumATK 模拟非常重要。然而,下面章节给出了一些关于 QuantumATK 算法和选项的提示,也可能有助于解决内存或速度问题。
如果矩阵非常大,可以考虑将 AlgorithmParameters 中的 density_matrix_method 设置为 DiagonalizationSolver(processes_per_kpoint=2)。这将使每个 mpi 进程的内存使用减少 2 倍。如果问题持续存在,请尝试增大 processes_per_kpoint。
如果计算量非常大,且计算是在 并行 中的许多节点上运行,那么将 AlgorithmParameters 的 density_matrix_method 设置为 ChebyshevExpansionSolver 是很值得尝试的做法。当大规模并行运行时,内存使用将显著减少,但与普通情况相比还是很慢。
尝试将 SelfEnergyCalculator 中的 storage_strategy 设置为 StoreOnDisk 或 NoStorage。这将显着减少内存,但也会降低之后的性能。如果是 并行 运行,由于内存是分布式的,每个核的内存减少量将更低。
器件的横截面较宽,可以尝试将 equilibrium_method 和/或 non_equilibrium_method 设置为 SparseGreensFunction。
如果是 并行 运行,将 equilibrium_method 和/或non_equilibrium_method 设置为 SparseGreensFunction(processes_per_contour_point=2) 会有所帮助。如果问题仍然存在,试着设置 processes_per_contour_point=4。
如果计算需要使用多重网格方法,如存在栅的情况,可能对于 possion_solver 要考虑 DirectSolver。这样将需要更多的内存,但是开销是内存分配的,因此如果是 并行 运行,则值得尝试。
设置 AlgorithmParameters 中的 store_basis_on_grid 为 True。这将使计算运行更快,并具有适度但分布式的内存开销。
在 ATK 2015 中为 AlgorithmParameters 中的 density_matrix_method 引入了两个新增参数:processes_per_kpoint 和 bands_above_fermi_level。
1 algorithm_parameters = AlgorithmParameters( 2 density_matrix_method=DiagonalizationSolver( 3 bands_above_fermi_level=20, 4 processes_per_kpoint=2 5 ), 6 )
下图展示了使用 32 个 k 点进行 InGaAs 块体构型完整 SCF 运行时间的关系图。默认情况下,您最多可以并行超过 32 个 mpi 进程(红线)。您可以运行以下脚本来快速检查计算中使用了多少个 k 点:
1 mk = MonkhorstPackGrid(4,4,4) 2 irriducible_kpoints = mk.kpoints() 3 print(len(irreducible_kpoints), ' irreducible kpoints')
通过设置 processes_per_kpoint,您现在可以进一步推动并行(蓝线)。
图:在 Xeon E5-2687W @ 3.1GHz 16固化/节点集群上运行的 InGaAs 合金的 199 基准图。时序对应于完整的 SCF 周期(19 步内收敛)。
实际上,您可以调整许多参数获得器件构型的最佳性能。哪些参数需要调整呢?这其实上取决于您正在研究的系统和所使用的方法。