梅森素数测试软件教程

本文介绍如何利用CPU和GPU计算GIMPS任务。

目录

最近又折腾了一下系统,顺便也就想尝试一下GIMPS别的跑法。本文总结了一下在GIMPS项目中推荐使用的几款软件以及它们的使用方法。关于什么是GIMPS,请参考我之前的文章。GIMPS项目依赖PrimeNet网络进行任务的分发和收集,目前在测试新的梅森素数时PrimeNet会依次分配三种任务:TrialT FactoringFP-1PM1分解和Probable PrimePRP测试。因此本文主要介绍这三类任务的运行方法和推荐策略。

首先在跑这些测试的时候,如果你不想获得分数credits则可以直接使用这些软件;但是我还是推荐在GIMPS网站上注册一个账号,以便访问PrimeNet自动获取和提交任务,这样是最高效地参与下一个梅森素数的寻找。

这些软件的使用一般都有两个方法,可以使用命令行参数输入也可以通过从worktodo.txt文件中读取。worktodo.txt里面任务的格式是由PrimeNet定义的,如果你从GIMPS官网手动下载任务,那么获取到的是文本内容,每一行会定义一个任务。这样的文本放进worktodo.txt便可以被下文的软件所识别。

mprime: 支持CPU上的所有任务

mprime是GIMPS官方开发的素数测试软件,在Windows上它的另一个名字叫prime95(P95),被广泛地用于装机之后的压力测试。这个软件支持PrimeNet所有的计算任务,它只能使用CPU进行计算,但是它针对各种CPU都做了完备的优化,因此如果你想在CPU上运行素数测试直接去用官方的软件就好~

mprime正式发布的版本可以在GIMPS官网下载到,而最新的测试版软件可以在镜像网站1下载到。

Linux下的mprime用命令行即可运行,在使用之前可能需要安装GMP高精度计算库(Ubuntu下运行sudo apt install libgmp10即可);而Windows下prime95对应的库文件已经打包进去,不需要额外安装库。在第一次运行软件的时候,程序会首先提示加入PrimeNet,这是需要输入你在GIMPS上的用户名(注意这里不要输入昵称)。之后设置计算任务的偏好、每天运行的时间、使用多少CPU和内存等等。mprime里面有多个worker,每个worker可以运行不同的计算任务,并且会利用多个进程进行计算。调整每个worker的设置可以更细粒度地调整计算资源的分配。

在Linux下使用mprime还有个需要注意的点是在第一次运行设置好之后,后面每次启动mprime就不会在命令行输出内容了。如果想继续使用菜单需要用mprime -m命令启动。

mfaktc: 支持GPU上的TF任务

GPU相比CPU更适合并行计算,而TF是其中很适合并行的任务,因此它的效率是最高的,也是GPU相比CPU最有优势的项目。而其他的两个任务在GPU上跑时程序只能利用GPU的FFT算法加速乘法计算,无法利用其他性能。

GPU计算TF目前大家都使用的软件是mfaktc(基于CUDA)和mfakto(基于OpenCL)。它们编译好的版本可以在镜像网站1下载到。需要注意的是,镜像网站下载的版本对mfaktc有一定改进(主要是调整了一些参数以适应新显卡),因此如果你从源文件编译的话可以使用镜像里也提供的更改后的源码。另外,如果下载已经编译好的包的话需要安装对应版本的CUDA运行时。

它们的使用方法很简单,以mfaktc为例:从GIMPS官网下载任务后放在一个worktodo.txt文件里,然后在同目录运行mfaktc即可开始。最开始的时候mfaktc会有自检流程,如果你的显卡驱动或者硬件有问题,mfaktc会报错。这其实也是一种检查显卡有没有问题的方法hhh。

mfaktc也被一些BOINC上的素数寻找项目所使用,例如SRBase就利用这个软件分发任务给用户,并且它的TF结果也会上传回PrimeNet。因此如果你参与BOINC上的一些素数项目,它们也会给PrimeNet贡献结果,只是这些结果不会在计算到GIMPS里你的用户上面。

GpuOwl: 支持GPU上的PRP任务

GpuOwl是由Mihal Preda编写的开源软件2,它是这几个GPU软件中唯一还在持续更新的软件,因此这里的教程也可能随着更新而失效。在写这篇博客的时候,GpuOwl的最新版本是v7.2。它在Windows下的可执行文件可以在镜像网站1下载到,而Linux版则大概率是需要自己编译的

GpuOwl支持PRP和PM1任务,但是它主要用途是利用GPU计算PRP任务。由于只有GpuOwl计算时可以提供PRP的证明文件,因此目前不推荐使用其他的同类软件(例如CudaLucas)。使用GpuOwl自带的primenet.py文件3可以实现自动任务获取和提交。

GpuOwl支持多GPU计算,使用方法是启动多个GpuOwl进程,每个进程使用-device指定所使用的GPU,再使用-pool指定多个GPU共享的任务目录。把计算任务在这个目录的worktodo.txt文件里,每个GpuOwl都会按需从这个文件中获取任务进行计算。

GpuOwl + mprime: 支持GPU上的PM1任务

原生支持PM1任务的软件有GpuOwlCUDAPm1,后者的代码快10年没什么更新了,而且只支持N卡,因此实际上好用的还是GpuOwlGpuOwl在最近的更新之后支持一个骚操作,就是由它来计算PM1任务的一阶段,然后把结果导入到mprime里面计算二阶段。这样的话既可以利用GPU的计算能力,又可以利用大量的内存来计算二阶段(一般而言GPU的内存容量是小于主机RAM的,而计算二阶段时的内存是越多越好)。目前使用GpuOwl是无法直接得到PM1任务的结果的,因为代码里没有计算最后的最大公约数这一步,因此目前必须捆绑mprime使用。

具体的使用方法是在运行GpuOwl的时候指定-mprimeDir目录,将一阶段的计算结果以mprime可以读取的格式存到这个目录下。这个目录会生成每个指数对应的文件和一个worktodo.add文件。之后把这些文件拷贝到mprime所在目录下mprime就会识别这些任务并加到它自己的worktodo.txt里面。

在使用者方法时可以考虑限制一下mprime不要获取新的任务,而是只跑GpuOwl生成的任务。按照作者的推荐,可以在mprime同目录下的prime.txt中增加如下设置:

1
2
3
4
SequentialWorkToDo=1
MaxExponents=1000
UnreserveExponents=1000
NoMoreWork=1
INI

任务类型之间的得分效率对比

如果你像我一样想在GIMPS上拿到更高的分数,那么有必要了解的是这三种的任务的得分效率是不同的。虽然GIMPS分数的计算是根据任务的计算量来的,但是由于硬件型号、软件优化等问题,这个工作量只能是一个估计值,而且它并不与实际所花时间成正相关。GIMPS的工作量单位是Ghz-DaysGHD,例如1GHD的计算量等价于1Ghz的CPU计算24小时达到的计算量。

根据我的经验,TF任务的得分效率最高、PM1次之、而PRP最低。我虽然没有做过CPU的实验,但是在GPU上我的经验是一张1080Ti左右的显卡,TF的得分效率可以达到700GHD每天,PM1的话有200到300,而PRP的效率只有100~200GHD每天。因此这三个任务的选择逻辑大概是:如果想拿到最多的分数就跑TF、如果想利用内存或者找到大因数就跑PM1、如果想成为发现下一个梅森素数的人就跑PRP。如果你想自己去测试效率的话可以使用这个得分计算器

另外根据我的经验(主要是用GPU跑),每个任务分别的效率比较如下:

  • TF:位数越低、指数越低则效率越高(也就是说PrimeNet的前沿任务是最高效的)

    根据mfaktc的估计值来看,用1080Ti跑73-74位数的时候,2亿左右的指数效率在每天750GHD左右,但是9亿就只有700GHD了。

  • PM1: 指数越低、B2越高则效率越高。另外同指数情况下,得分主要由B2决定,因此最好设置B1为比较低的值。

    提供几个参考数据(用13700K和4090,GPU跑一阶段,CPU四线程跑二阶段)

    指数B1B2一阶段耗时二阶段耗时最终得分得分效率
    1.19亿240万2.6亿2小时2.5小时126GHD28GHD/小时
    1.19亿320万2.6亿2.5小时2.5小时132GHD26GHD/小时
    3.32亿320万2.1亿7小时19.5小时362GHD13.6GHD/小时
    3.32亿320万1.8亿7小时18.5小时323GHD12.7GHD/小时
  • PRP:似乎指数越高则效率越高,但是差距不是很大

    RTX4080上1.13亿左右的指数需要跑53个小时,得分大概500GHD,效率为每小时9.4GHD;而3.32亿左右的指数跑需要500小时,得分大概5000GHD,效率为每小时10GHD。


本文粗略地介绍了以上这些软件的用法,如有更高级的需要可以参考各软件自带的说明文件(都很简陋),或者Mersenne论坛的这一篇总结帖

我目前个人使用的策略如下:

  • TF:仅GPU运行。通过任务分工表寻找目前最小指数的TF任务,然后手动领任务。
  • PM1:CPU使用mprime自动获取最小指数的PM1任务,GPU选择最小指数的PM1任务、以及一亿位以上梅森数里面B1较小的4
  • PRP:仅GPU运行。通过GpuOwl自动获取最小指数的PRP任务和一亿位以上梅森数的任务。

  1. 由James Heinrich搭建的mersenne.ca网站提供了很多与GIMPS相关的工具、数据和排名。它还提供基本所有非官方的计算软件下载。 ↩︎ ↩︎ ↩︎

  2. GpuOwl的Github地址为github.com/preda/gpuowl。 ↩︎

  3. primenet.py里面可以指定要获取的任务,任务名称的定义可以参见GIMPS官网的任务类型页面 ↩︎

  4. 如果想寻找一亿位以上梅森数还没有跑过PM1的指数,可以从这个链接获取。 ↩︎

使用 Hugo 构建
主题 StackedJimmy 设计,Jacob 修改