在 ARM 平台上安装、编译和运行 Mlucas 并进行 FFTs 测试

概述

Mlucas 是一个用 C 编写的开源软件,专门用于多平台架构的高性能梅森数素性测试。在 ARM 平台上,由于 prime95/mprime 仅支持 x86 架构,Mlucas 成为理想的替代方案。详细介绍了如何在 ARM 平台上安装、编译并运行 Mlucas,包括对各类参数的深入介绍与示例,并结合硬件资源优化进行了详细的配置步骤。

范围

适用于希望在 ARM 平台上执行 FFTs 测试并优化硬件性能的技术人员。本文主要针对运行 Debian 系统的 ARM64 设备,但同样适用于其他 Linux 发行版,步骤可能略有不同。

职责

  • 系统管理员:确保 ARM 平台上所需的软件和库均已正确安装,具备系统管理权限。
  • 操作员:严格按照本 SOP 进行 Mlucas 的安装、编译、调优和运行。

要求

  • ARM64 架构的设备,运行 Linux 操作系统(如 Debian 或 RHEL9)。
  • 基本的命令行操作知识。
  • 具备 sudo 或 root 权限。
  • 有效的互联网连接以下载必要的软件包和源码。

过程

1. 系统环境准备

1.1 更新系统软件包列表

  • 在进行软件安装前,先确保系统软件包是最新的。
    1
    2
    sudo apt-get update
    sudo apt-get upgrade

1.2 安装必要的依赖包

  • Debian

    1
    sudo apt-get install build-essential libgmp-dev libhwloc-dev git clang
  • RHEL9

    1
    2
    sudo dnf group install "Development Tools"
    sudo dnf install gmp-devel hwloc-devel clang git

2. 下载和准备 Mlucas

2.1 从 GitHub 克隆 Mlucas 源码

  • 使用以下命令克隆 Mlucas 项目到本地目录。也可以从 Release 页面 下载源码包。
    1
    git clone https://github.com/primesearch/Mlucas.git

2.2 进入 Mlucas 项目目录

1
cd Mlucas

3. 编译 Mlucas

3.1 设置编译器

  • 将编译器设置为 clang 以优化编译过程。
    1
    export CC=clang

3.2 使用 makemake.sh 脚本编译 Mlucas

  • 执行 makemake.sh 脚本,确保启用 hwloc 支持,以优化 CPU 绑定和内存访问性能。
    1
    bash makemake.sh use_hwloc

3.3 确认编译成功

  • 编译完成后,编译生成的可执行文件将位于 obj 目录中。使用以下命令查看生成的文件:
    1
    ls obj
  • 生成的文件名可能会因编译选项的不同而变化,如 Mlucas.

4. 性能调优:为您的机器进行优化

STEP 2 − PERFORMANCE-TUNE FOR YOUR MACHINE

在 Mlucas 编译完成后,重要的是对软件进行调优,以便充分利用您的硬件资源。这一步骤涉及运行一系列测试,以确定适合您机器的最佳 FFT 长度和 CPU 绑定配置。

4.1 运行自检

  • 自检测试将评估您的硬件性能,并生成配置文件,帮助确定适合的 FFT 长度和其他参数。运行以下命令:

    1
    ./Mlucas -s
  • 该命令将测试多个 FFT 长度和 CPU 配置,以确定最佳配置。测试结果将存储在生成的日志文件中。

4.2 分析自检结果

  • 自检完成后,打开并分析生成的日志文件(通常是 mlucas.cfg 或其他输出文件),查看不同 FFT 长度下的性能表现。

    1
    cat mlucas.cfg
  • 该文件会列出每个 FFT 长度的平均迭代时间。较短的时间意味着更优的性能。选择那些具有最短迭代时间的 FFT 长度和配置。

4.3 配置 Mlucas

  • 根据自检结果,手动编辑 mlucas.cfg 文件,以使用最佳配置进行实际测试。例如,设置合适的 FFT 长度和 CPU 绑定。
    1
    nano mlucas.cfg
  • 在配置文件中指定最佳 FFT 长度和 CPU 核心分配,如:
    1
    2
    FFTlength=2048K
    CPU=0-7

4.4 再次测试并验证

  • 使用优化后的配置重新运行 Mlucas,并通过日志文件验证性能是否有所提升。
    1
    ./Mlucas -s m -logfile optimized_test.log
  • 实时查看日志文件以确认测试正在按预期的配置进行:
    1
    tail -f optimized_test.log

5. Mlucas 参数设置与执行 FFTs 测试

5.1 获取系统的 CPU 信息

  • 在执行测试之前,获取并了解测试机器的 CPU 配置情况。
    1
    lscpu
  • 例如,输出结果可能为:
    1
    2
    3
    4
    CPU(s):              32
    Thread(s) per core: 1
    NUMA node0 CPU(s): 0-15
    NUMA node1 CPU(s): 16-31

5.2 Mlucas 常用参数介绍

  • -s:指定自检或特定素性测试模式。常见值包括:
    • -s:自检模式,测试系统性能并生成配置文件。
    • -s m:启动梅森数的快速测试。
    • -s q:启动快速素数测试(例如 Fermat 测试)。
  • -cpu:指定使用的 CPU 核心范围。格式为 -cpu start:end,例如 -cpu 0:15 表示使用 CPU 0 到 15 号核心。
  • -fftlen:设置 FFT 长度。FFT 长度决定了可处理的最大数字大小。常见值为 1024K, 2048K, 4096K 等。
  • -iters:设置每个测试的迭代次数。更高的迭代次数可提供更精确的结果,但需要更多时间。
  • -logfile:指定日志文件路径。默认值为 mlucas.log

5.3 FFT 测试的参数示例

  • 自检模式:
    1
    ./Mlucas -s
  • 运行 FFTs 测试并指定 CPU 核心范围:
    1
    ./Mlucas -s m -cpu 0:3 -fftlen 2048K -iters 10000 -logfile fft_test.log
  • 对不同核心组运行 FFTs 测试:
    1
    2
    3
    4
    5
    6
    7
    8
    ./Mlucas -s m -cpu 0:3
    ./Mlucas -s m -cpu 4:7
    ./Mlucas -s m -cpu 8:11
    ./Mlucas -s m -cpu 12:15
    ./Mlucas -s m -cpu 16:19
    ./Mlucas -s m -cpu 20:23
    ./Mlucas -s m -cpu 24:27
    ./Mlucas -s m -cpu 28:31

5.4 监控测试进度

  • Mlucas 运行过程中会生成日志文件,可以使用以下命令实时查看日志以监控测试进度和性能表现:
    1
    tail -f mlucas.log

5.5 常见优化建议

  • 调整 FFT 长度:根据硬件配置和测试目标,选择适合的 FFT 长度。较大的 FFT 长度通常适用于处理更大的数字,但可能会增加计算时间。
  • 核心绑定:通过 -cpu 参数绑定特定核心组,以避免不同进程争夺相同的 CPU 资源,从而提升性能。

6. 优化与维护

6.1 优化 CPU 绑定

  • 根据测试需求和系统资源,调整 -cpu 参数中的核心范围,以进一步优化计算性能。

6.2 定期更新

  • 通过定期从 GitHub 仓库获取最新的源码,并重新编译,以确保使用最新版的 Mlucas 并获得最新的性能优化。

7. 自动化测试脚本

7.1 编写自动化测试脚本

  • 以下是 Bash 脚本run_mlucas.sh的详细说明,用于自动化 Mlucas 的测试过程。该脚本支持两种 FFT 模式 (smalllarge),根据 CPU 核心数量自动分配核心组,并并行运行多个 Mlucas 实例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash

# 定义 FFT 模式和其他关键参数
fft_mode="small" # 默认模式为 small,可以通过传入参数修改
fft_mode=$1 # 接收传入的 FFT 模式参数
mlucas_dir="/Mlucas" # 定义 Mlucas 目录路径
s_mode="l"
duration=60 # 定义测试持续时间
cd $mlucas_dir

# 定义配置文件和核心分配策略
small_cfg_file="mlucas_small.cfg"
large_cfg_file="mlucas_large.cfg"
cores_per_group=2 # 每组分配的核心数量

# 删除旧的配置文件
rm mlucas.cfg -f

# 检查并初始化 small FFT 配置文件
if [ ! -f "$small_cfg_file" ]; then
echo "Basic testing - small FFTs..."
./obj_asimd/Mlucas -s small -cpu 0:$((cores_per_group-1)) >& small_test.log
mv mlucas.cfg mlucas_small.cfg
echo "Initialized mlucas_small.cfg."
fi

# 检查并初始化 large FFT 配置文件
if [ ! -f "$large_cfg_file" ]; then
echo "Basic testing - large FFTs, this will take a long time..."
./obj_asimd/Mlucas -s large -cpu 0:$((cores_per_group-1)) >& large_test.log
mv mlucas.cfg mlucas_large.cfg
echo "Initialized mlucas_large.cfg."
fi

# 如果两个配置文件都存在,提取相关信息
if [ -f "$small_cfg_file" ] && [ -f "$large_cfg_file" ]; then
echo "$small_cfg_file and $large_cfg_file are existed."
small_fft=$(tail -n 1 mlucas_small.cfg | awk -F " " '{print $1}')
small_fft_radix=$(tail -n 1 mlucas_small.cfg | awk -F " " '{print $11}')
small_fft_time=$(tail -n 1 mlucas_small.cfg | awk '{print $4}')

large_fft=$(tail -n 1 mlucas_large.cfg | awk -F " " '{print $1}')
large_fft_radix=$(tail -n 1 mlucas_large.cfg | awk -F " " '{print $11}')
large_fft_time=$(tail -n 1 mlucas_large.cfg | awk '{print $4}')

small_fft_iter=$(echo "$small_fft_time 1000 $duration" | awk '{printf "%.0f\n", $3 / ($1 / $2)/ 2}')
large_fft_iter=$(echo "$large_fft_time 1000 $duration" | awk '{printf "%.0f\n", $3 / ($1 / $2)/ 2}')
fi

# 根据模式设置链接和参数
if [ "$fft_mode" = "large" ]; then
instance_count=1
ln -s mlucas_large.cfg mlucas.cfg
else
instance_count=2
ln -s mlucas_small.cfg mlucas.cfg
fi

# 根据模式选择 FFT 配置
if [ "$fft_mode" = "large" ]; then
fft=$large_fft
fft_radix=$large_fft_radix
iter=$large_fft_iter
else
fft=$small_fft
fft_radix=$small_fft_radix
iter=$small_fft_iter
fi
echo fft: $fft fft_radix: $fft_radix iter: $iter

# 创建运行环境
echo "Creating env..."
rm $mlucas_dir/runset -rf
rm $mlucas_dir/jobs.sh -f
mkdir -p $mlucas_dir/runset
echo "#!/bin/bash" >> jobs.sh

# 获取 CPU 核心数量
cores=$(cat /proc/cpuinfo | grep processor | wc -l)

# 计算总共需要多少组
num_groups=$((cores / cores_per_group))

# 循环输出每组的核心范围并生成任务脚本
for ((i = 0; i < num_groups; i++)); do
start=$((i * cores_per_group))
end=$((start + cores_per_group - 1))
echo "Group $i: $start:$end"
mkdir $mlucas_dir/runset/run$i
for ((j = 0; j < instance_count; j++)); do
echo "cd $mlucas_dir/runset/run$i && nohup ../../obj_asimd/Mlucas -fft $fft -iters $iter -maxalloc 50 -cpu $start:$end -radset 1 >> $mlucas_dir/runset/run$i/test$j.log 2>&1 &" >> jobs.sh
done
done

# 运行生成的任务脚本
echo "Running jobs.sh..."
bash jobs.sh
echo "jobs.sh running in background."
echo "'pkill -x Mlucas' to end testing."

7.2 脚本运行说明

  • 该脚本在启动时会根据传入的参数选择 FFT 模式(small 或 large),并自动初始化相应的配置文件。
  • 脚本自动检测系统中的 CPU 核心数量,并将核心划分为多个组,每组运行一个或多个 Mlucas 实例。
  • 生成的任务脚本 jobs.sh 会在后台启动所有的 Mlucas 实例,并记录测试日志。

7.3 执行脚本

  • 在终端中执行脚本,传入所需的 FFT 模式(如 smalllarge)。
    1
    bash run_mlucas.sh small

7.4 监控日志

  • 脚本将测试日志记录在每个核心组的 test.log 文件中,可以通过以下命令实时监控日志:
    1
    tail -f /Mlucas/runset/run0/test0.log

7.5 停止测试

  • 如果需要终止测试,可以使用以下命令终止所有正在运行的 Mlucas 实例:
    1
    pkill -x Mlucas

参考文献