我对 MPI、套接字和 TCP/IP 有一些困惑。所有这三种通信协议都可以使用不同的互连,如 Infiniband、以太网还是其他?对不起,如果这个问题听起来很幼稚,但我真的对这三个术语感到困惑。
2 回答
TCP/IP 是一系列网络协议。IP 是较低级别的协议,负责在 Internet 上从一个地方到另一个地方获取数据包。TCP 位于 IP 之上并添加了虚拟电路/连接语义。仅使用 IP,您只能发送和接收未组织成流或连接的独立数据包。几乎可以使用任何物理传输机制来移动 IP 数据包。对于本地网络,它通常是以太网,但您可以使用任何东西。甚至还有一个 RFC 指定了一种通过信鸽发送 IP 数据包的方法。
套接字是用于访问操作系统网络功能的半标准 API。您的程序可以调用各种名为 socket、bind、listen、connect 等的函数来发送/接收数据、连接到其他计算机以及侦听来自其他计算机的连接。理论上,您可以通过套接字 API 使用任何网络协议系列——协议系列是您传入的参数——但现在您几乎总是指定 TCP/IP。(另一个常用的选项是本地 Unix 套接字。)
MPI 是一种 API,用于在服务器集群上运行的进程之间传递消息。MPI 的级别高于 TCP/IP 和套接字。它理论上可以使用任何网络协议系列,如果它使用 TCP/IP 或套接字 API 支持的其他系列,那么它可能使用套接字 API 与操作系统进行通信。
如果您的问题背后的目的是决定您应该如何编写并行编程应用程序,那么您可能不应该关注 TCP/IP 或套接字,因为这些东西将比您想要的低得多。您可能希望查看 MPI 或任何 PGAS 语言,如 UPC、Co-array Fortran、Global Arrays、Chapel 等。它们将比基本上编写自己的网络层更容易使用。
当您使用这些更高级别的库之一时,您会获得许多不错的抽象,例如集体操作、远程内存访问和其他功能,这些功能使您更容易编写并行代码,而不是处理底层的所有操作系统内容。它还使您的代码可以在不同的机器/架构之间移植。