我有与OpenMP并行化的fortran代码。我想在运行HPC之前在我的电脑上测试我的代码。我的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'
我的代码及其可执行文件位于桌面上的文件夹测试中,因此:
cd Desktop/test
这是正确的吗?
然后我编译我的简单代码:
implicit none
!$OMP PARALLEL
write(6,*)'hi'
!$OMP END PARALLEL
end
按命令:
gfortran -fopenmp test.f
然后运行:
./a.out
但只有一个" hi"打印为输出。我该怎么办? (以及关于这个网站的问题:在这样的情况下我应该编辑我的帖子或只是添加评论?)
答案 0 :(得分:4)
您不需要也可能不想在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
模仿超级计算机的行为。
只有在使用qsub
运行脚本时才会设置PBS变量。您可能没有在PC上使用它,也可能不想拥有它。
$PBS_O_WORKDIR
是运行qsub
命令的目录,除非您通过其他方式进行不同的设置。
$PBS_NUM_PPN
是您在#PBS -l nodes=1:ppn=2
中指明的数字。队列系统会读取并为您设置此变量。
答案 1 :(得分:2)
您发布的脚本适用于Portable Batch System(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个线程。队列系统可能会将这些参数传递给进程启动程序(除了针对OpenMP应用程序的OMP_NUM_THREADS之外,还为MPI应用程序设置srun / mpirun / aprun / ...)。
如果要在没有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,根据您的问题)。
答案 2 :(得分:0)
如果您希望您的Linux机箱环境像HPC登录节点。您可以执行以下操作
确保您的编译器支持OpenMP,使用OpenMP标志测试一个简单的hello world程序
从您最喜爱的软件包管理器在您的系统上安装OpenMPI,或从网站下载源代码/二进制文件(OpenMPI Download)
我不建议像您的实验那样安装像Slurm这样的集群管理器
完成后,您可以通过mpirun包装器执行MPI程序
mpirun -n <no_of_cores> <executable>
编辑:
这假设你只运行这个MPI。请注意,OpenMP也使用核心。如果您在单个节点上运行MPI + OpenMP - n*OMP_NUM_THREADS=cores
。