3

我需要知道一些关于
中域映射上的数组元素分配的事情 让我尽可能简短

region    = {1..10,5..10}
regionbox = {1..5,1..5}
grid2d    = /*a 2D arrangement of locales*/
Space     = domain(2) dmapped Block( boundingBox    = regionbox,
                                     target_locales = grid2d
                                     ) = region.
var : myarray[Space] int;

现在Space是分布式域。
所以这里进来了。
在分布式域中,我们是否必须将所有索引保留在每个位置,
例如上面的示例。
我们是否必须在所有语言环境中本地保留映射到语言环境的索引?我希望域映射支持全局视图编程,所以当我们访问时myarray[3,5],它会使用 dist 动态映射到关联区域设置。
如果我错了,请纠正我

以及如何在分布式域上分配数组?
域地图是否具有一些特征,它们在开始时根据给定的参数计算各个局部大小,并在每个语言环境中分配 local_size 元素?
就像
在 2 个语言环境中阻止 10 个元素一样,本地大小需要为 5。我想知道如何在分布式域上创建数组元素,以及根据分布映射到位置的索引是否存储在该位置?
如果这个问题需要更多信息,请告诉我
谢谢您的帮助

4

1 回答 1

5

和你之前的问题一样,这个问题的答案取决于具体的域图。Chapel 语言和编译器期望域映射(及其域和数组的实现)支持标准接口,但如何实现该接口完全取决于其作者。该接口包括诸如“为我分配一个新域”、“为我在该域上分配一个新数组”、“迭代域/数组的索引/元素”、“随机访问数组”等内容。因此,给定的域映射实现可能非常节省空间且最小化,或者它可以冗余地分配每个语言环境上的所有内容,正如其作者认为的那样。

也就是说,如果我们考虑像 之类的标准域映射Block,它们的行为方式与您期望的一样:例如,对于跨 4 个语言环境映射的 {1..n, 1..n} 数组,每个语言环境将存储~(n**2 / 4)数组的元素而不是所有n**2元素。将通过确定哪个语言环境拥有该元素并让编译器/运行时管理获取该远程元素所需的通信来实现对该数组的随机访问(由域映射实现)。当信息只需要 O(1) 存储时,信息就会被冗余存储,因为这种冗余比通过通信来获取值更好。例如,每个语言环境都将存储域/数组的 {1..n, 1..n} 边界,因为存储这些边界比与某个集中位置通信以获取它们更便宜。

这是一张图片可以值一千字的情况之一。看看我们介绍这些概念的演讲幻灯片(如本演示文稿的第 34 张幻灯片)可能比以下基于文本的描述更有启发性。

浏览您的声明并稍微清理一下,这大致是执行此代码时发生的情况:

const region    = {1..10,5..10},
      regionbox = {1..5,1..5},
      grid2d    = /*a 2D arrangement of locales*/;

这些声明与其他语言环境无关(没有 on 子句,没有 dmapped 子句),因此这些都会导致域和数组本地存储在遇到声明的任务正在执行的语言环境(程序的语言环境 #0启动时间)。

const Space     : domain(2) dmapped Block( boundingBox    = regionbox,
                                           target_locales = grid2d
                                           ) = region.

dmapped Block(...)子句导致Block域映射类的实例在grid2d. 该类的每个实例都存储边界框 ( regionbox) 和目标语言环境集。每个语言环境还获得一个类的实例,该类表示名为的分布的本地视图,该视图LocBlock存储由边界框和目标语言环境集定义的该语言环境所拥有的 2D 平面的子集。

的声明和初始化Space调用Block上一步中创建的域映射对象的当前语言环境副本上的方法,要求它创建一个新域。这会导致每个语言环境grid2d分配一对分别对应于域的全局和本地视图的类。全局描述符将域的索引描述为一个整体(例如region),而本地描述符则描述了该语言环境的个人子集region

var myarray: [Space] int;

Space此声明要求在上一步中创建的全局域类的当前语言环境副本创建一个新数组。这会导致每个语言环境grid2d分配一对表示数组的全局和局部视图的类。数组的全局视图往往不会存储太多状态,主要用于将数组上的方法分派到适当的本地描述符。本地描述符存储对应于语言环境子数组的数组元素。

我希望这有助于澄清您所询问的问题。

于 2017-08-10T00:51:04.877 回答