这是命令 mpy.openmpi,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
mpy - 消息传递约里克
概要
mpirun -np mp_size MPY [-j 文件1.i [-j 文件2.i [ ... ]]] [ -一世 文件1.i [ -一世 文件2.i [
...]]]
mpirun -np mp_size MPY -批 文件.i
商品描述
约里克 是一种解释性语言,如 Basic 或 Lisp,但速度要快得多。 看 约里克 (1)来
了解更多。
mpy 是一个并行版本 约里克 基于消息传递接口 (MPI)。 这
启动并行作业的确切语法取决于您的 MPI 环境。 它可能是
在调用之前需要启动一个特殊的守护进程 米伦 或等效命令。
说明
mpy 包将 yorick 连接到 MPI 并行编程库。 MPI代表
消息传递接口; 这个想法是连接 yorick 的多个实例
它们之间通过消息进行通信。 Mpy 可以执行简单的、高度并行的
任务作为纯解释程序,或者它可以启动和控制任意复杂的编译
可以免费使用已编译的 MPI API 的软件包。 解释的 API 不是有意的
成为 MPI 包装器; 相反,它被剥离到最低限度。
这是mpy的第2版(2010年发布); 它与mpy的版本1不兼容
(发布于 1990 年代中期),因为版本 1 有许多设计缺陷,使其非常
很难编写没有竞争条件的程序,并且不可能扩展到数百万
处理器。 但是,您可以通过执行以下操作在版本 1 下运行大多数版本 2 mpy 程序
mp_include,"mpy1.i" 在你 mp_include 定义一个 mpy1 并行任务的任何文件之前(即
在任何包含对 mp_task 调用的文件之前。)
用法 笔记
MPI 环境并没有真正被标准指定; 现有环境是
非常粗糙,并且强烈支持非交互式批处理作业。 进程数是
在 MPI 开始之前修复; 每个进程都有一个等级,一个从 0 到 XNUMX 的数字小于
进程数。 您使用等级作为发送消息的地址,过程
接收到消息可以探查一下是哪些rank发送了消息给它,当然
接收这些消息。
编写消息传递程序的一个主要问题是处理事件或消息
以计划外的顺序到达。 MPI 仅保证发送的消息序列
等级 A 到等级 B 将按照发送的顺序到达。 不保证顺序
这些消息相对于从第三等级 C 发送到 B 的消息的到达。
特别地,假设 A 向 B 发送消息,然后 A 向 C 发送消息(甚至交换
带有 C) 的几个消息,导致 C 向 B 发送消息。来自 C 的消息
可能在来自 A 的消息之前到达 B。 MPI 程序不允许这样做
可能性有一个称为“竞争条件”的错误。 竞争条件可能非常微妙,
尤其是当进程数量很大时。
基本的mpy解释接口由两个变量组成:
mp_size = 进程数
mp_rank = 这个过程的等级和四个函数:
mp_send, to, msg; // 发送 msg 到排名“to”
msg = mp_recv(from); // 从等级“from”接收消息
等级 = mp_probe(块); // 查询待处理消息的发件人
mp_exec,字符串; // 在每个等级上解析并执行字符串
您在 rank 0 上调用 mp_exec 以启动并行任务。 当主程序这样创建时
完成后,除 0 级以外的所有 rank 返回空闲循环,等待下一个
mp_exec。 等级 0 从 stdin 中选取下一个输入行(即,在其等待输入
在交互式会话中提示),或者如果没有更多输入则终止所有进程
在批处理会话中可用。
mpy 包修改了 yorick 处理 #include 解析器指令的方式,以及 include
并需要函数。 也就是说,如果一个并行任务正在运行(即一个函数启动
by mp_exec),这些都变成了集体操作。 也就是说,rank 0 读取整个
文件内容,并将内容作为 MPI 消息发送到其他进程(如
mp_exec 文件内容)。 除了等级 0 之外的每个进程都只在
并行任务; 当只有等级 0 正在运行时(以及所有其他等级)在并行任务之外
正在等待下一个 mp_exec)、#include 指令和 include 和 require
函数返回到它们通常的串行操作,只影响 0 级。
当mpy启动时,它处于并行模式,因此yorick包含的所有文件
开始(Y_SITE/i0 中的文件)作为集体操作包括在内。 没有这个
功能,每个 yorick 进程都会尝试打开和读取启动包含文件,
在 mpy 启动之前重载文件系统。 传递这些内容
文件作为 MPI 消息是确保每个文件都有足够带宽的唯一方法
读取单个文件内容的过程。
启动时包含的最后一个文件是 -batch 选项中指定的文件,或者
custom.i 文件。 避免 custom.i 中的代码出现问题,这可能不安全
并行执行时,mpy 不查找 custom.i,而是查找 custommp.i。 这
-batch 文件或 custommp.i 中的指令在 rank 0 上以串行模式执行
只要。 同样,mpy 覆盖了通常的 process_argv 函数,因此 -i 和其他
命令行选项仅在串行模式下的 rank 0 上处理。 所有这些的意图
情况是使 -batch 或 custommp.i 或 -i 包含文件仅在等级 0 上执行,如
如果您在那里以交互方式输入它们。 您可以从任何这些中自由调用 mp_exec
文件来启动并行任务,但文件本身是串行的。
一个额外的命令行选项被添加到通常的集合中:
mpy -j somefile.i
在所有等级上以并行模式包含 somefile.i(同样,-i other.i 仅包含 other.i
在串行模式下排名 0)。 如果有多个 -j 选项,则并行包含发生
按命令行顺序。 但是,如果 -j 和 -i 选项混合使用,则会发生所有 -j 包括
在任何 -i 包括之前。
作为 mpy 中包含函数复杂性的副作用,自动加载功能是
残疾; 如果您的代码实际上通过调用自动加载函数触发了包含,则 mpy
将因错误而停止。 您必须显式加载并行计算所需的任何函数
使用 require 函数的任务在并行任务中调用自身。
mp_send 函数可以发送任何数字 yorick 数组(类型 char、short、int、long、
float、double 或 complex),或标量字符串值。 发送消息的过程
via MPI 只保留元素的数量,所以 mp_recv 只产生一个标量值或
一维值数组,无论传递给 mp_send 的维度是什么。
mp_recv 函数要求您指定要发送的消息的发件人
收到。 它阻塞,直到消息真正从该发件人到达,排队任何
可能提前到达的其他发件人的消息。 排队的消息将是
当您为匹配的发件人调用 mp_recv 时,检索收到的订单。 这
排队功能使避免最简单类型的竞争条件变得非常容易
当您编写解释型并行程序时。
mp_probe 函数返回所有排队消息的发送者的列表(或者 nil 如果
队列为空)。 称呼 mp_探针(0) 立即返回,即使队列为空。
电话联系 mp_探针(1) 如果队列为空则阻塞,只有至少有一条消息时才返回
可用于 mp_recv。 称呼 mp_探针(2) 阻塞直到新消息到达,即使
目前有一些消息可用。
mp_exec 函数使用对数扇出 - 等级 0 发送到 F 个进程,每个进程
再发送给 F,依此类推,直到所有进程都收到消息。 一旦一个过程
完成它的所有发送操作,它解析并执行消息的内容。
扇出算法在 N 步的基数 F 中达到 N 个进程。 F进程
rank 0 发送到的是rank 1, 2, 3, ..., F。 一般来说,rank r 的进程发送到
排名 r*F+1, r*F+2, ..., r*F+F(当 N 个进程的这些小于 N-1 时)。 这一套
被称为 r 级的“员工”。 r>0 的秩从秩 (r-1)/F 接收消息,
这被称为 r 的“老板”。 mp_exec 调用与 mp_recv 队列互操作;
换句话说,在 mp_exec 扇出期间,来自除 boss 以外的等级的消息将是
排队等待 mp_recv 稍后检索。 (没有这个特性,任何并行任务
使用对数扇出以外的消息模式会容易受到竞争的影响
状况。)
对数扇出及其内部等价物非常有用,以至于 mpy 提供了一对
使用与 mp_exec 相同的扇出模式的更高级别的函数:
mp_handout,味精;
总计 = mp_handin(value);
要使用 mp_handout,rank 0 计算一个 msg,然后所有的 rank 调用 mp_handout,它发送 msg
(除 0 以外的所有等级的输出)通过与 mp_exec 相同的扇出无处不在。 使用
mp_handin,每个进程计算值,然后调用mp_handin,返回总和
他们自己的价值和他们所有的员工,所以在等级 0 mp_handin 返回的总和
每个过程的价值。
您可以将 mp_handin 作为没有参数的函数来调用以充当同步; 什么时候
rank 0 在这样的调用后继续,你知道其他所有的 rank 都达到了那个点。
所有并行任务(任何以 mp_exec 开始的任务)必须以调用 mp_handin 结束,
或等价的保证当任务执行时所有进程都返回到空闲状态
以 0 级结束。
您可以使用 mp_nfan 函数检索或更改扇出参数 F。 默认的
值为 16,即使对于非常大量的进程,这也应该是合理的。
一项特殊的并行任务称为 mp_connect,您可以使用它来提供已解释的
任何单个非 0 等级的命令行,而所有其他等级都闲置。 排名 0 位于
循环读取键盘并将行发送到“已连接”等级,该等级执行
它们,并将确认发送回等级 0。您运行 mp_disconnect 函数以
完成并行任务并回退到等级 0。
最后,关于错误恢复的说明。 如果在并行任务期间发生错误,
mpy 尝试优雅地退出 mp_exec,以便当排名 0 返回时,所有其他排名
已知空闲,准备下一个 mp_exec。 如果有的话,这个过程将永远挂起
其中一个进程处于无限循环中,或者处于永远不会的状态
调用 mp_send、mp_recv 或 mp_probe,因为 MPI 不提供发送信号的方法
中断所有进程。 (这是 MPI 环境的一种方式
“粗”。)排名 0 的进程与第一个报告了
故障,加上由于非故障原因而出现故障的进程数的计数
发送了一条消息,指出另一个级别出现故障。 第一个故障进程可以进入dbug
通过 mp_connect 模式; 使用 mp_disconnect 或 dbexit 在等级 0 上回退到串行模式。
可选项
-j 文件.i 包括 Yorick 源文件 文件.i 当 mpy 以并行模式启动时
在所有级别。 这相当于mpy之后的mp_include函数
已经开始。
-i 文件.i 包括 Yorick 源文件 文件.i 当 mpy 以串行模式启动时。
这等效于 mpy 启动后的 #include 指令。
-批 文件.i 包括 Yorick 源文件 文件.i 当 mpy 以串行模式启动时。
您的自定义文件 custommp.i(如果有)是 而不去 阅读,而mpy是
置于批处理模式。 在批处理功能上使用 help 命令
(帮助,批处理)以了解有关批处理模式的更多信息。 在批处理模式下,所有
错误是致命的; 通常,mpy 会停止执行并等待更多
错误后输入。
使用 onworks.net 服务在线使用 mpy.openmpi