运行 PC 上的并行代码

running parallel code on PC

我有已与 OpenMP 并行化的 Fortran 代码。在 HPC 上 运行ning 之前,我想在我的 PC 上测试我的代码。我的电脑有双核 CPU,我在 Linux-mint 上工作。我安装了 gfortranmultilib,这是我的脚本:

#!/bin/bash
### Job name
#PBS -N pme
### Keep Output and Error
#PBS -j eo
### Specify the number of nodes and thread (ppn) for your job.
#PBS -l nodes=1:ppn=2
### Switch to the working directory;
cd $PBS_O_WORKDIR
### Run:
OMP_NUM_THREADS=$PBS_NUM_PPN
export  OMP_NUM_THREADS
ulimit -s unlimited
./a.out

echo 'done'

我还应该对 运行 我的代码做些什么?

好的,我按照答案中的建议更改了脚本:

#!/bin/bash
### Switch to the working directory;
cd Desktop/test
### Run:
OMP_NUM_THREADS=2
export  OMP_NUM_THREADS
ulimit -s unlimited
./a.out

echo 'done'

我的代码及其可执行文件在桌面上的文件夹 test 中,所以:

cd Desktop/test

这是正确的吗?

然后我编译我的简单代码:

  implicit none
  !$OMP PARALLEL
  write(6,*)'hi'
  !$OMP END PARALLEL
  end

通过命令:

gfortran -fopenmp test.f

然后 运行 通过:

./a.out

但只有一个 "hi" 被打印为输出。我应该怎么办? (还有一个关于这个网站的问题:在这种情况下我应该编辑我的 post 还是只添加评论?)

您发布的脚本适用于便携式批处理系统 (https://en.wikipedia.org/wiki/Portable_Batch_System) 队列系统。这意味着,您想要在 HPC 基础设施上 运行 的作业必须首先进入队列系统,当资源可用时,作业将在系统上 运行。

一些命令(以#PBS 开头的命令)是此队列系统的特定命令。在这些命令中,有些命令允许用户指示应用程序进程层次结构(即进程和线程的数量)。另外,请记住,由于所有 PBS 命令都以 # 开头,因此它们会被常规 shell 脚本执行忽略。在您介绍的情况下,由

给出
### Specify the number of nodes and thread (ppn) for your job.
#PBS -l nodes=1:ppn=2

如注释所示,它应该告诉队列系统您想要 运行 1 个进程,每个进程将有 2 个线程。队列系统可能会将这些参数传递给进程启动器(srun/mpirun/aprun/...除了 OMP_NUM_THREADS 用于 OpenMP 应用程序之外,MPI 应用程序也是如此。

如果您想 运行 在没有 PBS 队列的计算机上执行此作业,您应该至少了解两件事。

1) 下面的命令

### Switch to the working directory;
cd $PBS_O_WORKDIR

将被翻译成 "cd" 因为环境变量 PBS_O_WORKDIR 仅在 PBS 作业上下文中定义。因此,您应该更改此命令(或在执行之前执行另一个 cd 命令)以修复您想要 运行 作业的位置。

2) 同样对于 PBS_NUM_PPN 环境变量,

OMP_NUM_THREADS=$PBS_NUM_PPN
export  OMP_NUM_THREADS

如果你不在 PBS 作业上下文中 运行 这个变量将不会被定义,所以你应该将 OMP_NUM_THREADS 设置为你想要的值(2,根据你的问题) 手动。

您不需要也可能不想在您的 PC 上使用该脚本。甚至没有学习如何使用这样的脚本,因为这些脚本与每台超级计算机的细节有太多联系。

我使用了多个 supercomputers/clusters,我不能只是重复使用一个的脚本,因为它们有很大的不同。

在您的 PC 上,您只需执行以下操作:

  1. 可选,可能是默认的

    export OMP_NUM_THREADS=2
    

将 OpenMP 线程数设置为 2。如果需要其他数字,请调整。

  1. cd 到工作目录

    cd my_working_directory
    

您的工作目录是您拥有所需数据或可执行文件所在的目录。在您的情况下,它似乎是 a.out 所在的目录。

  1. 运行 这该死的东西

    ulimit -s unlimited
    ./a.out
    

就是这样。

你也可以将标准输出和错误输出存储到一个文件中

    ./out > out.txt 2> err.txt

模仿超级计算机的行为。


PBS 变量仅在您 运行 使用 qsub 脚本时设置。您的 PC 上可能没有它,您可能也不想拥有它。

$PBS_O_WORKDIR 是您 运行 执行 qsub 命令的目录,除非您通过其他方式对其进行了不同的设置。

$PBS_NUM_PPN 是您在 #PBS -l nodes=1:ppn=2 中指定的数字。队列系统读取并为您设置此变量。

如果您希望 linux box 环境像一个 HPC 登录节点。您可以执行以下操作

  • 确保您的编译器支持 OpenMP,使用 OpenMP 标志测试一个简单的 hello world 程序

  • 通过您最喜欢的包管理器在您的系统上安装 OpenMPI 或从网站 (OpenMPI Download)

  • 下载 source/binary
  • 我不建议为您的实验安装像 Slurm 这样的集群管理器

完成后,您可以通过 mpirun 包装器执行您的 MPI 程序

mpirun -n <no_of_cores> <executable>

编辑:

这是假设您是 运行 这唯一的 MPI。请注意,OpenMP 也使用内核。如果你是 运行 MPI+OpenMP - n*OMP_NUM_THREADS=cores 在单个节点上。