运行 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 上,您只需执行以下操作:
可选,可能是默认的
export OMP_NUM_THREADS=2
将 OpenMP 线程数设置为 2。如果需要其他数字,请调整。
cd 到工作目录
cd my_working_directory
您的工作目录是您拥有所需数据或可执行文件所在的目录。在您的情况下,它似乎是 a.out
所在的目录。
运行 这该死的东西
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
在单个节点上。
我有已与 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 上,您只需执行以下操作:
可选,可能是默认的
export OMP_NUM_THREADS=2
将 OpenMP 线程数设置为 2。如果需要其他数字,请调整。
cd 到工作目录
cd my_working_directory
您的工作目录是您拥有所需数据或可执行文件所在的目录。在您的情况下,它似乎是 a.out
所在的目录。
运行 这该死的东西
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
在单个节点上。