域如何在多维情况下将映射索引映射到目标语言环境数组
How Domain maps map indexes to target locales array in multi-dimension case
我没有找到 domain 地图如何将多维 domain 中的索引映射到多维目标区域设置。
1.) 目标语言环境(一维)如何以多维方式排列,等于分布维度映射索引?
2.) 在文档中指出,对于多维情况,应该在每个维度上进行计算。对于 domain {1..8, 1..8}
==> dom
假设 dom
块分布在 6 个目标语言环境中。
映射步骤
1 对第一个维度 (1..8) 进行计算
如果 idx
是 low<=idx<=high
那么 locid
就是
floor (idx-low)*N / (high-low+1)
给我一个索引说 i
.
对第二个维度重复相同的操作,这给了我一个索引说 j
。
现在我有一个元组 ( i, j )
这是如何映射到维度 2 的目标语言环境数组的?
domain 地图如何将 1D 目标区域设置数组更改为分布维度?
是reshape函数之类的吗?
如果信息不足,请告诉我。
有关域的索引如何映射到程序的语言环境的具体细节不是由 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
数组,文档说:
If the rank of targetLocales
is 1
, a greedy heuristic is used to reshape the array of target locales so that it matches the rank of the distribution and each dimension contains an approximately equal number of indices.
例如,如果我们分布到一个 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
参数如果不是完美的正方形,将如何重塑,但我们可以通过在域上使用 targetLocales()
query 来了解实践中做了什么.另请注意,如果未提供 targetLocales
数组,则默认使用整个 Locales
数组(一维)。作为对这两件事的说明,如果以下代码在六个语言环境中是 运行:
var D0 = D dmapped Block(D);
writeln(D0.targetLocales());
我们得到:
LOCALE0 LOCALE1
LOCALE2 LOCALE3
LOCALE4 LOCALE5
说明当前启发式匹配我们上面明确的 grid1
声明。
我没有找到 domain 地图如何将多维 domain 中的索引映射到多维目标区域设置。
1.) 目标语言环境(一维)如何以多维方式排列,等于分布维度映射索引?
2.) 在文档中指出,对于多维情况,应该在每个维度上进行计算。对于 domain {1..8, 1..8}
==> dom
假设 dom
块分布在 6 个目标语言环境中。
映射步骤
1 对第一个维度 (1..8) 进行计算
如果 idx
是 low<=idx<=high
那么 locid
就是
floor (idx-low)*N / (high-low+1)
给我一个索引说 i
.
对第二个维度重复相同的操作,这给了我一个索引说 j
。
现在我有一个元组 ( i, j )
这是如何映射到维度 2 的目标语言环境数组的?
domain 地图如何将 1D 目标区域设置数组更改为分布维度?
是reshape函数之类的吗?
如果信息不足,请告诉我。
有关域的索引如何映射到程序的语言环境的具体细节不是由 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
数组,文档说:
If the rank of
targetLocales
is1
, a greedy heuristic is used to reshape the array of target locales so that it matches the rank of the distribution and each dimension contains an approximately equal number of indices.
例如,如果我们分布到一个 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
参数如果不是完美的正方形,将如何重塑,但我们可以通过在域上使用 targetLocales()
query 来了解实践中做了什么.另请注意,如果未提供 targetLocales
数组,则默认使用整个 Locales
数组(一维)。作为对这两件事的说明,如果以下代码在六个语言环境中是 运行:
var D0 = D dmapped Block(D);
writeln(D0.targetLocales());
我们得到:
LOCALE0 LOCALE1
LOCALE2 LOCALE3
LOCALE4 LOCALE5
说明当前启发式匹配我们上面明确的 grid1
声明。