HPX 的内存架构
Memory Architecture of HPX
HPX 支持 Active Global Address Space.Over 很长一段时间,我无法弄清楚 "AGAS" 到底是什么?通过对支持 memory models 的 HPX-5 进行一些研究。我能看到的是在 "AGAS: memory can be moved to other localities in order to balance the system" 中,但在 "PGAS" 中却看不到。但是在 hpx 中,我们仍然使用创建它的参数(本地的全局标识符)来创建远程对象(组件)。但是在台式机中使用 HPX 确实隐藏了此功能,并且在 rostam 中使用 运行 HPX 我无法将它与 "PGAS" 内存系统区分开来。你能帮我理解 HPX 的这个黑魔法功能吗?
您可以将 AGAS 视为分布式 key/value 'in memory' 数据库。
当你在本地创建一个对象时,你会得到一个标准品种的指针,可以使用 *this
或 this->
来访问内部结构。
但是,您不能将 this
指针从一个节点传递到另一个节点并任意使用它。
当您创建一个 hpx::
组件或注册一个您使用 AGAS 创建的对象时,它实际上将 this
指针存储在数据库中,并为您提供一个 hpx::id_type
作为句柄(键)。此 id 可用于本地或远程节点上的函数调用,作为引用对象的一种方式。
如果您将对象从一个节点移动到另一个节点(使用 agas 函数),那么 AGAS 将更新它的内部值以反映 this
指针已更改值的事实(它将在内部具有其析构函数在本地调用并调用将内容移动到在别处构造的新内容中)并且位于另一个节点上,但是密钥 - 您为该对象拥有的 id_type 仍然有效 - 请注意,这仅在以下情况下为真AGAS 正在做搬迁 - 如果你只是在别处创建一个副本并删除一个本地对象,那就不一样了。
在一个PGAS系统上,一般来说,所有的节点都共享一块内存,每个节点都可以'access' memory/data/objects在另一个节点上,通过索引到这个共享内存中区域。所以在 PGAS 中,其他节点上的项的地址是 'fixed',即节点 1 上的数据位于 shared_region + offset*1,节点 2 上的数据位于 + offset*2 等等.这是一个轻微的简化,但你明白了。
在 HPX 中,对象可以自由浮动,您可以通过 id_type 引用它们并让 AGAS 处理 'real' 地址查找。这就是 'Active' 在 AGAS 而不是 PGAS 中的原因。
通过这种方式,数据项(组件)可以从一个地方重新定位到另一个地方,但引用它们的句柄可以是不可变的。
从这个意义上说,AGAS 的 'Address Space' 部分是说 hpx::id_type 可以被认为是跨越作业中所有节点的地址。
HPX 支持 Active Global Address Space.Over 很长一段时间,我无法弄清楚 "AGAS" 到底是什么?通过对支持 memory models 的 HPX-5 进行一些研究。我能看到的是在 "AGAS: memory can be moved to other localities in order to balance the system" 中,但在 "PGAS" 中却看不到。但是在 hpx 中,我们仍然使用创建它的参数(本地的全局标识符)来创建远程对象(组件)。但是在台式机中使用 HPX 确实隐藏了此功能,并且在 rostam 中使用 运行 HPX 我无法将它与 "PGAS" 内存系统区分开来。你能帮我理解 HPX 的这个黑魔法功能吗?
您可以将 AGAS 视为分布式 key/value 'in memory' 数据库。
当你在本地创建一个对象时,你会得到一个标准品种的指针,可以使用 *this
或 this->
来访问内部结构。
但是,您不能将 this
指针从一个节点传递到另一个节点并任意使用它。
当您创建一个 hpx::
组件或注册一个您使用 AGAS 创建的对象时,它实际上将 this
指针存储在数据库中,并为您提供一个 hpx::id_type
作为句柄(键)。此 id 可用于本地或远程节点上的函数调用,作为引用对象的一种方式。
如果您将对象从一个节点移动到另一个节点(使用 agas 函数),那么 AGAS 将更新它的内部值以反映 this
指针已更改值的事实(它将在内部具有其析构函数在本地调用并调用将内容移动到在别处构造的新内容中)并且位于另一个节点上,但是密钥 - 您为该对象拥有的 id_type 仍然有效 - 请注意,这仅在以下情况下为真AGAS 正在做搬迁 - 如果你只是在别处创建一个副本并删除一个本地对象,那就不一样了。
在一个PGAS系统上,一般来说,所有的节点都共享一块内存,每个节点都可以'access' memory/data/objects在另一个节点上,通过索引到这个共享内存中区域。所以在 PGAS 中,其他节点上的项的地址是 'fixed',即节点 1 上的数据位于 shared_region + offset*1,节点 2 上的数据位于 + offset*2 等等.这是一个轻微的简化,但你明白了。
在 HPX 中,对象可以自由浮动,您可以通过 id_type 引用它们并让 AGAS 处理 'real' 地址查找。这就是 'Active' 在 AGAS 而不是 PGAS 中的原因。 通过这种方式,数据项(组件)可以从一个地方重新定位到另一个地方,但引用它们的句柄可以是不可变的。 从这个意义上说,AGAS 的 'Address Space' 部分是说 hpx::id_type 可以被认为是跨越作业中所有节点的地址。