Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 消息传递任意对象图?_Multithreading_Language Agnostic_Networking_Parallel Processing_Mpi - Fatal编程技术网

Multithreading 消息传递任意对象图?

Multithreading 消息传递任意对象图?,multithreading,language-agnostic,networking,parallel-processing,mpi,Multithreading,Language Agnostic,Networking,Parallel Processing,Mpi,我希望在Beowulf集群上并行一些代码,这样涉及的CPU就不会共享地址空间。我想在外循环中并行化函数调用。函数调用没有任何“重要”的副作用(尽管它们使用随机数生成器、分配内存等) 我已经研究过像MPI这样的LIB,我看到的问题是,它们似乎使在节点之间传递复杂的对象图变得非常重要。我的函数的输入是指向一个非常复杂的对象图的this指针。我的函数的返回类型是另一个复杂的对象图 在语言不可知的层面上(我使用的是D编程语言,我几乎可以肯定这里没有现成的解决方案,但我愿意创建一个),是否有一种“典型”的

我希望在Beowulf集群上并行一些代码,这样涉及的CPU就不会共享地址空间。我想在外循环中并行化函数调用。函数调用没有任何“重要”的副作用(尽管它们使用随机数生成器、分配内存等)

我已经研究过像MPI这样的LIB,我看到的问题是,它们似乎使在节点之间传递复杂的对象图变得非常重要。我的函数的输入是指向一个非常复杂的对象图的this指针。我的函数的返回类型是另一个复杂的对象图

在语言不可知的层面上(我使用的是D编程语言,我几乎可以肯定这里没有现成的解决方案,但我愿意创建一个),是否有一种“典型”的方式来处理跨节点传递复杂状态的问题?理想情况下,我希望状态如何被复制的细节被完全抽象出来,并且调用看起来几乎像正常的函数调用。我不在乎在网络上复制这么多的状态是否特别有效,因为所讨论的并行级别是如此的粗粒度以至于可能不重要


编辑:如果没有简单的方法来传递复杂的状态,那么通常如何使用消息传递?在我看来,任何涉及通过网络复制数据的操作都需要粗粒度并行,但粗粒度并行通常需要传递复杂状态,以便在一个工作单元中完成大量工作。

我做了大量的MPI编程,但我不知道传递复杂状态的任何典型方式(如您所述)进程之间。这是我一直在思考你的问题,它可能符合你自己的想法

我猜想,在内存中,复杂对象图是由数据块和指向其他数据块的指针表示的——这是一种常见的图形实现。如何最好地将其中一个COG(缩写)从一个进程的地址空间移动到另一个进程的地址空间?如果指针是内存地址,那么一个地址空间中的指针在另一个地址空间中就没有用处了,因此您必须将其转换为某种中性形式进行传输(我想是吧?)

因此,要发送COG,必须将其转换为某种形式,接收进程可以在其自己的地址空间中构建一个本地版本的图形,指针指向本地内存地址。你曾经把这些齿轮写进文件吗?如果是这样的话,您已经有了一个可以传输一个的表单。我不想建议这样做,但您甚至可以使用文件在进程之间进行通信——这可能比D和MPI的组合更容易处理。你的选择

如果您没有齿轮的文件格式,您可以轻松地将其表示为邻接矩阵或列表吗?换言之,为运输制定自己的代表

如果您可以在进程之间传递COG,而不将其从基于指针的结构转换为更静态的结构(如数组或记录),我将非常惊讶(但很高兴了解)

编辑,响应OP的编辑。MPI确实提供了传递复杂状态的简单方法,前提是复杂状态表示为值而不是指针。您可以在内部或自定义MPI数据类型中传递复杂状态;正如其他答案中的一个所示,这些都是灵活和有能力的。如果我们的程序没有以MPI自定义数据类型可以处理的形式保持复杂状态,那么您必须编写函数来打包/解包到消息友好的表示形式。如果你能做到这一点,那么你的消息调用看起来(在大多数情况下)就像函数调用一样


至于围绕复杂状态和并行性的颗粒性的问题,我不确定我是否完全理解。我们(如果你愿意或不愿意,也包括你自己)通常求助于MPI编程,因为我们无法从单个处理器中获得足够的性能,我们知道我们将支付因等待通信而延迟计算的罚款,我们努力将罚款减至最低,但最终,我们接受了惩罚作为并行化的成本。当然,有些作业太小或太短,无法从并行化中获益,但我们(即并行计算学家)所做的很多工作都太大,运行时间太长,无法避免并行化,这取决于数据的组织。如果在对象中使用指针或自动内存,这将很困难。如果可以将对象组织为在内存中连续,则有两种选择:以字节形式发送内存、在接收器上将其强制转换回对象类型或为对象定义mpi派生类型。如果使用继承,由于对象在内存中的布局方式,事情将变得复杂


我不知道您的问题,但如果您手动管理内存,可能可以查看ARMCI

您可以使用自定义MPI数据类型完成奇妙的事情。我目前正在从事一个项目,其中多个MPI进程正在跟踪一片虚拟空间中的粒子,当粒子从一个进程的区域跨越到另一个进程的区域时,它们的数据(位置/速度/大小等)必须通过网络发送

我实现这一目标的方式如下:

1) 所有进程共享单个粒子的MPI数据类型,该粒子包含其所有相关属性,以及它们在内存中相对于粒子对象基址的位移

2) 在发送时,该过程迭代存储粒子的任何数据结构,记下需要发送的每个粒子的内存地址,然后构建一个数据类型,其中每个块的长度为1(上述粒子数据类型的长度),并从前面记下的内存地址开始。发送结果类型的1个对象将通过