【问题标题】:SGE/UGE/etc..standardized way to submit OpenMP jobs to multiple cores?SGE/UGE/etc..向多核提交 OpenMP 作业的标准化方式?
【发布时间】:2014-01-14 20:38:06
【问题描述】:

我正在寻找一种将 OpenMP 作业提交到 Grid Engine 调度程序的方法,同时指定它应该运行的内核数。相当于 LSF 的 -n 选项,或 PBS 的 -l nodes=[count] 选项。

当我对此进行搜索时,我看到一堆答案指定语法,例如“-pe 线程 [核数]”。在这些答案中,没有提到必须创建一个称为“线程”的并行环境。但是当我尝试这种语法时,它失败了,说请求的并行环境线程不存在。当我输入“qconf -spl”时,我得到的唯一结果是“make”。那么 - 这个“线程”并行环境应该默认存在,还是必须在集群上手动创建?

如果必须手动创建,是否有任何其他语法可以将作业提交到不依赖于集群上可配置命名的多个核心?这是针对提交到集群的第三方程序,所以我不想不仅依赖于创建了这个 pe 的客户端,而是将它命名为相同的等等......我希望 -l 选项可能有一些东西,但我无法找到任何排列来实现这一点。

【问题讨论】:

  • Grid Engine 安装的管理员定义和配置 pe(并行环境),因此,不,您不应该期望默认存在名为 threaded 的 pe。至于问题的其余部分,我无能为力,我很幸运能够让专家管理我使用的集群,因此不必担心太多细节。

标签: multithreading openmp hpc sungridengine


【解决方案1】:

如果您仅将“make”作为可能的并行环境,那么这意味着您的集群上没有设置并行环境。

根据这两种情况,您的问题有两种解决方案:

A) 您拥有集群的 root/admin 访问权限

B) 你没有

如果是 B,请让您的管理员创建一个并行环境。在情况 A 中,您必须创建一个并行环境。要创建新的并行环境,您必须键入(需要 root/admin 权限):

qconf -ap <pe_name>

默认编辑器将从您必须编辑的默认 pe_conf 文件开始。如果您只需要设置一个 openMP 并行环境,您可以使用以下选项:

pe_name            smp
slots              9999
user_lists         NONE
xuser_lists        NONE
start_proc_args    /bin/true
stop_proc_args     /bin/true
allocation_rule    $pe_slots
control_slaves     FALSE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary TRUE

对于 MPI 并行环境:

pe_name            mpi
slots              9999
user_lists         NONE
xuser_lists        NONE
start_proc_args    /opt/sge/mpi/startmpi.sh $pe_hostfile
stop_proc_args     /opt/sge/mpi/stopmpi.sh
allocation_rule    $fill_up
control_slaves     FALSE
job_is_first_task  TRUE
urgency_slots      min
accounting_summary TRUE

如您所见,在后一种情况下,您会将 SGE 指向 MPI 配置的正确初始化脚本和关闭脚本。在第一种情况下,您只需指向/bin/true

allocation_rule 在此示例中有所不同。 $fill_up 表示 SGE 将使用 MPI 作业的一部分填充它可以找到的任何 CPU,而对于 smp 配置,您只需在同一台机器上分配正确数量的插槽,即 $pe_slots

如果您使用 MPI,则应使用高性能交换机(例如 infiniband)连接您的节点,否则您的工作将花费更多时间进行通信而不是计算。

编辑: 哦,顺便说一句:在并行环境中提交作业的正确合成器是有效的:

qsub -pe <pe_name> <nb_slots>

最终编辑: 这个问题的最终答案在下面的 cmets 中。实际上,如果集群上没有设置并行环境 (PE),SGE 将无法处理多线程作业。如果您没有集群的管理员权限,您必须 猜测 使用 qconf -spl 使用正确的 PE 并使用 qconf -sp &lt;pe_name&gt; 检查不同的 PE,或者在您的软件允许用户指定必须使用的 PE。

否则,即如果集群上没有可用的 PE,您将无法使用软件的并行版本。

有关详细信息,请参阅 cmets。

【讨论】:

  • 如 OP 中所述,我们创建了一个与调度程序交互的第三方程序。所以我们非常希望找到一种不依赖于我们无法控制的因素的方法——即客户端是否配置了这些 pe,并以某种方式命名它们,等等......我们没有任何访问这些客户端系统。我们可以在所有其他调度程序中使用开箱即用的标志来做到这一点——这种“必须配置并行环境”的事情似乎是 SGE 特有的。这是 100% 的唯一方法吗?如果是这样,那么我们实际上没有适合我们的解决方案。 :-(
  • 话虽如此 - 你的 OpenMP 示例在那里。您的插槽为“9999”。那会在任何系统上工作吗? (即,我们是否可以包含一个管理员可以运行的脚本,该脚本将为他们进行设置,而不需要我们了解有关系统的任何信息、计算各种排列等......?)
  • 插槽 9999 不是问题,只要有效插槽的数量取决于正在使用的队列。
  • 啊,好的。我现在更好地理解了你的问题。不,如果没有使用 SGE 的并行环境,您将无法使用线程号选项。但也许您可以为您的软件添加一个选项,让用户可以指定必须使用的 pe_name?
  • 一个更老套的方法可能是通过在system() 调用中执行qconf -spl猜测并行环境,列出可用的并行环境,然后迭代几个PE 可用并使用qconf -sp &lt;pe_name&gt; 查看他们的配置,并寻找那些有你需要的人。然后只使用其中一个...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多