2

克雷,很抱歉再次为清晰的答案站起来!在这个答案之后,我还有一些关于域地图的问题。如果您能消除我对域映射的疑虑,我将不胜感激。
我希望,我已经按顺序排列了这些问题。

1.) 什么是域映射?- 域映射定义了从域和数组的全局数组索引到集群中的一组区域设置的映射。

我已经总结了我从研究论文和其他 ppts 中理解的内容,这可能是错误的。请随时更正答案。

const Domain = {1..8,1..8} dmapped Block( {1..8,1..8} )

这里{1..8,1..8}是 indexspace( domain ),它使用Block-distribution domain-map 和boundingBox = {1..8,1..8}
来自Blockdomain-map 构造函数的分布到语言环境,

proc block( boundingBox:              domain,
            targetlocales:[] locale = Locales,
            datapartasks            = ...,
            dataparmingranularity   = ...
            )

Blockdomain-map 只想知道,boundingBoX和'-stargetlocales并且datapar*不需要 a domain, 在这种情况下{1..8,1..8}。我发现很难让事情变得正确,因为有许多用于在本身内创建域地图的界面,其中一些界面对用户隐藏了一些信息。

所以我的问题是:Blockdomain-map 是否创建了实例 on targetlocales,它保存了本地索引集,例如{1..2,3..4}on locale 1{1..2,1..2}on locale 2(这些数字只是示例,以说明映射过程)?
在之前的回答中,Brad Chamberlain 博士提到过

“dmapped Block 子句()在目标语言环境上创建实例。Block 域地图类的每个实例都存储边界框和目标语言环境集”

我没有从中找到意义:(
总的来说,请解释域映射、域和数组如何协同工作。我研究了一些步骤,但都遗漏了一些我需要完全理解域映射的信息。

在幻灯片 No:34 的演示中,本地实例域映射和域仅存储索引空间,没有什么特别之处。

  1. 在之前的回答中,Brad Chamberlain 博士也提到过,

“给定的域映射实现可能非常节省空间和最小化,或者它可以冗余地分配每个语言环境中的所有内容,正如其作者认为的最好的那样”,

在这种情况下,“在每个语言环境中冗余分配所有内容”实际上是什么意思?是否将整个数组存储在每个位置?

  1. 在 PGAS 中,域映射、域、数组的全局实例在所有语言环境中都是可见的?我也希望对它们的每个查询都通过全局实例进行。

正如您在文档中提到的,我恳请您确定域映射所需的接口。
如果我对此有一些解释,我将不胜感激并感激不尽。
非常感谢。

4

1 回答 1

2

1.) 什么是域地图?

域映射是一个 Chapel 类,其目的是描述域以及在这些域上声明的任何数组是如何实现的。实际上,它们指定:

  • 如何实现根据该域映射声明的域,包括如何将它们存储在内存中以及如何实现编译器可能需要的方法(如迭代、成员资格测试等)
  • 如何实现根据该域声明的数组,包括如何将它们存储在内存中以及如何实现编译器可能需要的方法(如迭代、随机访问等)

块域映射只想知道boundingBox、targetlocales和datapar的,不需要域,这里是{1..8,1..8}。

Block这是正确的,这在学习分布时通常会引起混淆。让我们用一个稍微人为的例子来说明这一点:

const D = {1..4, 1..4} dmapped Block({1..8, 1..8});

该声明表明,2D 索引的平面应该通过{1..8, 1..8}尽可能均匀地阻塞语言环境之间的边界框来分布到语言环境。如果我在 4 个语言环境上运行,则语言环境 0 将拥有{1..4, 1..4}边界框,这意味着它将{-inf..4, -inf..4}在 2D 平面中拥有(其中,inf意味着“无限”,实际上,-inf将由一个小整数表示)。同样,区域设置 3 将拥有{5..8, 5..8}边界框或{5..inf, 5..inf}来自 2D 平面。

正如您所注意到的,{1..8, 1..8}以上只是域映射的一个参数,因此与' 的值Block无关,仅与它的实现有关。D因为D的价值是{1..4, 1..4}它完全由区域 0 拥有,因为它完全适合该区域设置的 2D 平面部分。相反,如果是{2..5, 2..5},区域设置 0 将拥有{2..4, 2..4},区域设置 1 将拥有{2..4, 5..5},区域设置 2 将拥有{5..5, 2..4},区域设置 3 将拥有{5..5, 5..5}

因为块分布是由这个边界框域参数化的,所以这通常会导致混淆为什么在声明中使用两个域,尤其是因为它们在实践中通常是相同的。这本质上与域映射无关,并且与 Block 域映射的构造函数期望域作为其参数之一这一事实有关。相比之下, theCyclicBlockCyclicdomain 映射不采用域参数,因此通常更易于理解。

块域映射是否在包含本地索引集的 targetlocales 上创建实例...

是的,在实践中,Block域映射创建了一个LocBlock类的实例,该实例存储每个语言环境的本地索引集——例如,在我之前的示例中{-inf..4, inf..4},在语言环境 0、{-inf..4, 5..inf}语言环境 1 等。

Block 域地图类的每个实例都存储边界框和目标语言环境集

是的,每个语言环境还存储Block域映射类的副本,该副本存储所有参数化域映射的关键参数,以便它定义的分布可以由每个语言环境单独推理。

在幻灯片编号:34 的演示中,本地实例域映射和域仅存储索引空间,没有什么特别之处。

没错,本地 Block 域地图类的作用是存储该区域所拥有的 2D 平面部分(幻灯片中的区域 #4 或 L4)。类似地,本地 Block 域类的作用是存储该区域所拥有的域索引集的一部分。这些并不特殊,但它们分别对于定义分布和分布式域很重要。

2.在上一个回答中,Brad 博士还提到“给定的域映射实现可能非常节省空间且最小化,或者它可以冗余地分配每个语言环境中的所有内容,正如其作者认为的那样”,在这种情况下“冗余地分配每个语言环境上的所有内容”实际上意味着什么?是否将整个数组存储在每个位置?

是的,通过“在每个语言环境中冗余分配所有内容”,我的意思是每个语言环境都存储整个数组。这可能不是特别可扩展,但关键是语言和域映射框架没有说明数组如何存储,只要它们支持预期的接口。因此,如果他们愿意,域地图的作者可以这样做。

  1. 在 PGAS 中,域映射、域、数组的全局实例在所有语言环境中都是可见的?我也希望对它们的每个查询都通过全局实例进行。

由于 Chapel 的 PGAS(分区全局地址空间)模型,您是正确的,类的全局实例在所有语言环境中都是可见的。也就是说,由于域之间的通信是昂贵的,并且这些对象往往很少改变它们的字段,实际上我们倾向于跨区域复制它们。在幻灯片 34 上,您提到的标签“(逻辑上)”是指:每个对象都有一个概念副本,但实际上我们倾向于跨区域复制它们(域地图的作者可能或可能不会按照他们的意愿这样做)。

正如您在文档中提到的那样,我恳请您确定域映射所需的接口。

有关域映射接口的当前文档可在此处获得。可以在此处Block找到实现 6 个描述符({global, local} x {domain map, domain, array})的域映射的当前来源。

于 2017-08-11T20:55:55.053 回答