我需要了解chapel中域域地图上数组元素分配的一些事项 让我尽可能缩短
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。
我想知道如何在分布式域上创建数组元素,以及根据分布映射到locality的索引是否存储在该位置?
如果这个问题需要更多信息,请告诉我
谢谢你的帮助
答案 0 :(得分:5)
与您的previous question一样,此问题的答案取决于具体的域地图。 Chapel语言和编译器期望域映射(及其域和数组的实现)支持标准接口,但它如何实现该接口完全取决于其作者。这个界面包括“为我分配一个新域”,“为我分配一个新域”,“迭代域/数组的索引/元素”,“随机访问数组”等等。 ,给定的域映射实现可能非常节省空间和最小,或者它可以冗余地分配每个语言环境中的所有内容,正如其作者认为最好。
也就是说,如果我们考虑像Block
这样的标准域映射,它们会按照您期望的方式运行:例如,对于跨4个语言环境映射的{1..n,1..n}数组,每个语言环境将存储数组的~(n**2 / 4)
元素而不是所有n**2
元素。对该数组的随机访问将通过确定哪个语言环境拥有该元素并让编译器/运行时管理获取该远程元素所需的通信(由域映射实现)来实现。当信息仅需要O(1)存储时,信息被冗余存储,因为这种冗余优于通信以获得值。例如,每个语言环境将存储域/数组的{1..n,1..n}边界,因为存储这些边界比与某个集中位置通信更便宜以获得它们。
这是一张图片价值千言万语的案例之一。看一下我们介绍这些概念的会谈幻灯片(如this presentation的幻灯片34)可能比以下基于文本的描述更有启发性。
遍历您的声明并稍微清理一下,这里大概是执行此代码时发生的事情:
const region = {1..10,5..10}, regionbox = {1..5,1..5}, grid2d = /*a 2D arrangement of locales*/;
这些声明没有任何内容涉及其他语言环境(没有on-clauses,没有dmapped子句),因此这些都会导致本地存储在执行遇到声明的任务的语言环境中的域和数组(语言环境#0)在该计划的启动时间)。
const Space : domain(2) dmapped Block( boundingBox = regionbox, target_locales = grid2d ) = region.
dmapped Block(...)
子句导致Block
域映射类的实例在grid2d
中的每个语言环境上分配。该类的每个实例都存储边界框({{1}})和一组目标语言环境。每个语言环境还获取一个类的实例,该类表示名为regionbox
的分布的本地视图,该分布存储由该边界框和目标语言环境集定义的该语言环境所拥有的2D平面的子集。 p>
LocBlock
的声明和初始化在上一步创建的Space
域映射对象的当前语言环境副本上调用一个方法,要求它创建一个新域。这会导致Block
中的每个区域设置分别分配对应于域的全局视图和本地视图的一对类。全局描述符描述域的索引作为一个整体(例如,grid2d
),而本地描述符描述该区域设置的region
的个人子集。
region
此声明询问当前区域设置在上一步中创建的全局var myarray: [Space] int;
域类的副本,以创建新数组。这会导致Space
中的每个语言环境分配一对表示数组的全局和本地视图的类。数组的全局视图往往不存储很多状态,主要用于将数组上的方法分派给适当的本地描述符。本地描述符存储与语言环境的子数组相对应的数组元素。
我希望这有助于澄清您所询问的问题。