我没有找到域映射如何将多维域中的索引映射到多维目标语言环境。
1。)目标区域设置(一维)如何以多维方式排列,等于分布维度以映射索引?
2。)在文档中,它声明对于多维情况,计算应该在每个维度进行。对于域{1..8, 1..8}
==> DOM
假设dom
是按块分布在6个目标语言环境中的。
映射步骤
第一维(1..8)的 1进行计算
如果idx
为low<=idx<=high
,则locid
为
floor (idx-low)*N / (high-low+1)
为我提供了一个索引i
。
对第二维重复相同的操作,这给我一个索引j
现在我有了一个元组( i, j )
如何将其映射到维度2的目标语言环境数组?
域映射用于将1D目标语言环境数组更改为分发维度的内容是什么?
类似于重塑功能吗?
如果缺乏足够的信息,请告诉我。
答案 0 :(得分:2)
关于域索引如何映射到程序的语言环境的具体细节不是由Chapel语言本身定义的,而是由用于声明域的域映射的实现定义的。在您提问的评论中,您提到您指的是Block
发布,因此我会在我的回答(documented here)中关注这一点,但请注意其他任何内容域映射可以采用不同的方法。
Block
分发采用可选的targetLocales
参数,允许您指定要定位的区域设置集以及它们的虚拟拓扑。例如,如果我声明并填充一些语言环境数组:
var grid1: [1..3, 1..2] locale, // a 3 x 2 array of locales
grid2: [1..2, 1..3] locale; // a 2 x 3 array of locales
for i in 1..3 {
for j in 1..2 {
grid1[i,j] = Locales[(2*(i-1) + j-1)%numLocales];
grid2[j,i] = Locales[(3*(j-1) + i-1)%numLocales];
}
}
然后我可以将它们作为targetLocales
参数传递给Block
- 分布式域的几个实例:
use BlockDist;
config const n = 8;
const D = {1..n, 1..n},
D1 = D dmapped Block(D, targetLocales=grid1),
D2 = D dmapped Block(D, targetLocales=grid2);
每个域都会将其n
行分发到其targetLocales
网格的第一维及其n
列到第二维。我们可以通过在这些域上声明整数数组并并行分配它们来查看此分布的结果,以使每个元素存储其拥有的语言环境ID,如下所示:
var A1: [D1] int,
A2: [D2] int;
forall a in A1 do
a = here.id;
forall a in A2 do
a = here.id;
writeln(A1, "\n");
writeln(A2, "\n");
在六个或更多语言环境(./a.out -nl 6
)上运行时,输出如下,显示底层网格结构:
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
4 4 4 4 5 5 5 5
4 4 4 4 5 5 5 5
0 0 0 1 1 1 2 2
0 0 0 1 1 1 2 2
0 0 0 1 1 1 2 2
0 0 0 1 1 1 2 2
3 3 3 4 4 4 5 5
3 3 3 4 4 4 5 5
3 3 3 4 4 4 5 5
3 3 3 4 4 4 5 5
对于一维targetLocales
数组,文档说:
如果
targetLocales
的等级为1
,则使用贪婪启发式来重塑目标语言环境数组,使其与分布的等级匹配,并且每个维度包含大致相等数量的索引
例如,如果我们分发到1维4元素的语言环境数组:
var grid3: [1..4] locale;
for i in 1..4 do
grid3[i] = Locales[(i-1)%numLocales];
var D3 = D dmapped Block(D, targetLocales=grid3);
var A3: [D3] int;
forall a in A3 do
a = here.id;
writeln(A3);
我们可以看到目标语言环境形成一个正方形,如预期的那样:
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
如果一个targetLocales
参数不是一个完美的正方形,那么文档有意模糊不清,但是我们可以通过{{{{{{我们可以找到在实践中做了什么? 3}}在域上。另请注意,如果未提供targetLocales
数组,则默认使用整个Locales
数组(即1D)。作为这两件事的说明,如果在六个区域设置上运行以下代码:
var D0 = D dmapped Block(D);
writeln(D0.targetLocales());
我们得到:
LOCALE0 LOCALE1
LOCALE2 LOCALE3
LOCALE4 LOCALE5
说明当前启发式符合上面的显式grid1
声明。