Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

利用 HPC 挑战对您的集群进行基准测试

此示例展示如何使用 HPC 挑战基准测试来评估计算集群的性能。该基准测试由几项测量不同内存访问模式的测试组成。欲了解更多信息,请参阅 HPC 挑战基准

准备 HPC 挑战

使用 parpool 函数在集群中启动并行工作进程池。默认情况下,parpool 使用您的默认集群配置文件创建一个并行池。在主页选项卡上的并行 > 选择默认集群中检查您的默认集群配置文件。在这个基准上,工作进程互相通信。为了确保优化内部通信,将 'SpmdEnabled' 设置为 true

pool = parpool(64,'SpmdEnabled',true);
Starting parallel pool (parpool) using the 'MyCluster' profile ...
Connected to parallel pool with 64 workers.

使用 hpccDataSizes 函数计算满足 HPC 挑战要求的每个单独基准的问题规模。这个大小取决于工作进程的数量和每个工作进程可用的内存量。例如,允许每个工作进程使用 1 GB。

gbPerWorker = 1;
dataSizes = hpccDataSizes(pool.NumWorkers,gbPerWorker);

运行 HPC Challenge

HPC Challenge 基准测试由几个部分组成,每个部分探索系统不同方面的性能。在下面的代码中,每个函数运行一个基准测试,并返回包含性能结果的行表。这些函数测试分布式数组上的各种操作。MATLAB 将分布式数组划分到多个并行工作进程上,这样它们就可以使用集群的组合内存和计算资源。有关分布式数组的更多信息,请参阅 分布式数组

HPL

hpccHPL(m),即 Linpack 基准,用于测量求解线性方程组的执行率。它创建了一个大小为 m×m 的随机分布实数矩阵 A 和一个长度为 m 的实数随机分布向量 b,并测量并行求解系统 x = A\b 的时间。其性能以 gigaflops(每秒十亿次浮点运算)为单位。

hplResult = hpccHPL(dataSizes.HPL);
Starting HPCC benchmark: HPL with data size: 27.8255 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: HPL in 196.816 seconds.

DGEMM

hpccDGEMM(m) 测量实数矩阵-矩阵乘法的执行速率。它创建随机分布的实数矩阵 ABC,大小为 m×m,并测量并行执行矩阵乘法 C = beta*C + alpha*A*B 的时间,其中 alphabeta 是随机标量。性能以 gigaflops 为单位返回。

dgemmResult = hpccDGEMM(dataSizes.DGEMM);
Starting HPCC benchmark: DGEMM with data size: 9.27515 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: DGEMM in 69.3654 seconds.

STREAM

hpccSTREAM(m) 评估集群的内存带宽。它创建长度为 m 的随机分布向量 bc,以及随机标量 k,并计算 a = b + c*k。该基准测试不使用工作进程之间的通信。性能以每秒千兆字节数返回。

streamResult = hpccSTREAM(dataSizes.STREAM);
Starting HPCC benchmark: STREAM with data size: 10.6667 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: STREAM in 0.0796962 seconds.

PTRANS

hpccPTRANS(m) 测量系统的进程间通信速度。它创建两个大小为 m×m 的随机分布矩阵 AB,并计算 A' + B。结果以每秒千兆字节为单位返回。

ptransResult = hpccPTRANS(dataSizes.PTRANS);
Starting HPCC benchmark: PTRANS with data size: 9.27515 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: PTRANS in 6.43994 seconds.

RandomAccess

hpccRandomAccess(m) 测量分布式向量中每秒可随机更新的内存位置数量。结果以 GUPS(每秒千兆更新)的形式返回。在这次测试中,工作进程使用编译成 MEX 函数的随机数生成器。将此 MEX 函数针对每个操作系统架构的版本附加到并行池,以便工作进程可以访问与其操作系统相对应的版本。

addAttachedFiles(pool,{'hpccRandomNumberGeneratorKernel.mexa64','hpccRandomNumberGeneratorKernel.mexw64','hpccRandomNumberGeneratorKernel.mexmaci64'});
randomAccessResult = hpccRandomAccess(dataSizes.RandomAccess);
Starting HPCC benchmark: RandomAccess with data size: 16 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: RandomAccess in 208.103 seconds.

FFT

hpccFFT(m) 测量长度为 m 的分布式向量上的并行快速傅里叶变换 (FFT) 计算的执行速率。该测试既测量系统的算术能力,也测量通信性能。性能以 gigaflops 为单位返回。

fftResult = hpccFFT(dataSizes.FFT);
Starting HPCC benchmark: FFT with data size: 8 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: FFT in 11.772 seconds.

显示结果

每个基准测试的结果都包含在一张包含统计数据的表中。连接这些行以提供测试结果的摘要。

allResults = [hplResult; dgemmResult; streamResult; ...
              ptransResult; randomAccessResult; fftResult];
disp(allResults);
      Benchmark       DataSizeGB      Time      Performance    PerformanceUnits
    ______________    __________    ________    ___________    ________________

    "HPL"               27.826        196.82       773.11         "GFlops"     
    "DGEMM"             9.2752        69.365       1266.4         "GFlops"     
    "STREAM"            10.667      0.079696       431.13         "GBperSec"   
    "PTRANS"            9.2752        6.4399       1.5465         "GBperSec"   
    "RandomAccess"          16         208.1     0.010319         "GUPS"       
    "FFT"                    8        11.772       6.6129         "GFlops"     

使用 batch 卸载计算

您可以使用 batch 函数将 HPC Challenge 中的计算卸载到您的集群并继续在 MATLAB 中工作。

在使用 batch 之前,请删除当前并行池。如果并行池已使用所有可用工作进程,则无法处理批处理作业。

delete(gcp);

使用 batch 将函数 hpccBenchmark 作为批处理作业发送到集群。该函数调用 HPC 挑战中的测试并在表中返回结果。当您使用 batch 时,一个工作进程将扮演 MATLAB 客户端的角色并执行该函数。此外,指定这些名称-值对参量:

  • 'Pool':为该作业创建一个具有工作进程的并行池。在这种情况下,指定 32 工作进程。hpccBenchmark 在这些工作进程上运行 HPC 挑战。

  • 'AttachedFiles': 将文件传输给池中的工作进程。在这种情况下,为每个操作系统架构附加一个 hpccRandomNumberGeneratorKernel 版本。当执行 hpccRandomAccess 测试时,工作进程会访问与其操作系统相对应的那个。

  • 'CurrentFolder':设置工作进程的工作目录。如果不指定此参量,MATLAB 会将工作进程的当前目录更改为 MATLAB 客户端中的当前目录。如果您想使用工作进程的当前文件夹,请将其设置为 '.'。当工作进程有不同的文件系统时这很有用。

gbPerWorker = 1;
job = batch(@hpccBenchmark,1,{gbPerWorker}, ...
    'Pool',32, ...
    'AttachedFiles',{'hpccRandomNumberGeneratorKernel.mexa64','hpccRandomNumberGeneratorKernel.mexw64','hpccRandomNumberGeneratorKernel.mexmaci64'}, ...
    'CurrentFolder','.');

提交作业后,您可以继续在 MATLAB 中工作。您可以使用作业监视器检查作业的状态。在主页选项卡上的环境区域中,选择并行 > 监控作业

在这种情况下,等待作业完成。要从集群中检索结果,请使用 fetchOutputs 函数。

wait(job);
results = fetchOutputs(job);
disp(results{1})
      Benchmark       DataSizeGB      Time      Performance    PerformanceUnits
    ______________    __________    ________    ___________    ________________

    "HPL"               13.913        113.34        474.69        "GFlops"     
    "DGEMM"             4.6376        41.915        740.99        "GFlops"     
    "STREAM"            5.3333      0.074617        230.24        "GBperSec"   
    "PTRANS"            4.6376        3.7058        1.3437        "GBperSec"   
    "RandomAccess"           8        189.05     0.0056796        "GUPS"       
    "FFT"                    4        7.6457        4.9153        "GFlops"     

当您使用大型集群时,您可以增加可用的计算资源。如果计算时间超过了工作进程之间的通信时间,则您的问题可以通过增加资源得到很好的解决。下图显示了在具有 4 个机器且每台机器有 18 个物理核心的集群中,HPL 基准测试随工作进程数量的变化情况。请注意,在此基准测试中,数据的大小随着工作进程数量的增加而增加。

另请参阅

|

相关主题