Parallel processing 教堂中分散子阵列的高效收集和传输
最近,我遇到了小教堂。我喜欢教程中给出的例子,但在我看来,其中许多例子是令人尴尬的平行。我正在研究多体量子物理中的散射问题,一个常见的问题可以归结为以下几点Parallel processing 教堂中分散子阵列的高效收集和传输,parallel-processing,hpc,low-latency,chapel,parallelism-amdahl,Parallel Processing,Hpc,Low Latency,Chapel,Parallelism Amdahl,最近,我遇到了小教堂。我喜欢教程中给出的例子,但在我看来,其中许多例子是令人尴尬的平行。我正在研究多体量子物理中的散射问题,一个常见的问题可以归结为以下几点 形状M x N x N的张量A由M不同参数1..M 需要张量A的子集来计算 每个参数1..M 问题的第一部分是令人尴尬的平行 因此,我的问题是,是否以及如何能够仅将张量A的所需子集传输到集群的每个区域并最小化必要的通信?当Chapel正确地完成其工作时,在分布式和本地阵列之间传输阵列片(例如)应以有效的方式执行。这意味着您应该能够使用Cha
M x N x N
的张量A
由M
不同参数1..M
1..M
因此,我的问题是,是否以及如何能够仅将张量A的所需子集传输到集群的每个区域并最小化必要的通信?当Chapel正确地完成其工作时,在分布式和本地阵列之间传输阵列片(例如)应以有效的方式执行。这意味着您应该能够使用Chapel的数组切片表示法编写这样的张量子集传输 例如,这里有一种编写这种模式的方法:
// define a domain describing a 5 x 7 x 3 index set anchored at index (x,y,z)
const Slice = {x..#5, y..#7, z..#3};
// create a new array variable that stores the elements from distributed array
// `myDistArray` locally
var myLocalArray = myDistArray[Slice];
新变量myLocalArray
将是一个数组,其元素是myDistArray
中元素的副本,如Slice
中的索引所述。myLocalArray
的域将是切片域Slice
,因此由于Slice
是非分布式域,myLocalArray
也将是本地/非分布式数组,因此,当从当前区域设置对Chapel的分布式数组表示法进行操作时,不会产生任何使用Chapel的分布式数组表示法的开销
到目前为止,我们主要致力于为块分布式阵列优化此类传输。例如,在上面的例子中,当MyDistary是块分布的时,我会看到区域设置之间的通信数量是固定的,因为我改变了片的大小(尽管这些通信的大小显然会根据需要传输的元素的数量而变化)。其他案例和模式需要更多的优化工作,因此,如果您发现一个案例没有如您所期望的那样执行/扩展,请针对它提交一份文件,以帮助提醒我们您的需要和/或帮助您找到解决方法
因此,勾勒出你描述的模式,我可以想象这样做:
// create a local and distributed version of the complete tensor space
const LocTensorSpace = {1..M, 1..N, 1..N},
TensorSpace = LocTensorSpace dmapped Block(LocTensorSpace);
// declare array A to store the result of step 1
var A: [TensorSpace] real;
// ...compute A here...
// declare a 1D distributed form of the parameter space to drive step 2
const ParameterSpace = {1..M} dmapped Block({1..M});
// loop over the distributed parameter space; each locale will use all its cores
// to compute on its subset of {1..M} in parallel
forall m in ParameterSpace {
// create a local domain to describe the indices you want from A
const TensorSlice = { /* ...whatever indices you need here... */ };
// copy those elements into a local array
var locTensor = A[TensorSlice];
// ...compute on locTensor here...
}
其他一些似乎与我有关但我不想让这个问题陷入困境的事情有:
- 如果需要,可以声明TensorSpace/A,以便只有1..M维度分布在区域设置中,{1..N,1..N}平面是本地的
- 还有一些方法可以查询区域设置所拥有的分布式数组的索引;结合上一点,这可能是一种减少所需通信量的方法,假设步骤2的迭代与
- 还有一些方法可以就地引用分布式阵列片和/或给它一个符号名,而不是像上面建议的那样创建它的本地副本
- 如果需要/首选,可以将A声明为2D数组的1D分布式数组,但如果要访问空间的3D切片,这可能没有那么好
chpl版本1.23.0预发行版(ad097333b1)中)
,不过我希望Chapel的最新版本也会出现同样的行为:
use BlockDist, CommDiagnostics;
config const M = 10, N=20;
const LocTensorSpace = {1..M, 1..N, 1..N},
TensorSpace = LocTensorSpace dmapped Block(LocTensorSpace);
var A: [TensorSpace] real;
forall (i,j,k) in TensorSpace do
A[i,j,k] = i + j / 100.0 + k / 100000.0;
config const xs = 5, ys = 7, zs = 3, // size of slice
x = M/2-xs/2, y = N/2-ys/2, z = N/2-zs/2; // origin of slice
const Slice = {x..#xs, y..#ys, z..#zs};
writeln("Copying a ", (xs,ys,zs), " slice of A from ", (x,y,z));
resetCommDiagnostics();
startCommDiagnostics();
var myLocArr = A[Slice];
stopCommDiagnostics();
writeln(getCommDiagnostics());
writeln(myLocArr);
writeln(myLocArr.isDefaultRectangular());
Hi@CKI-有几个问题希望我的答案尽可能与您的场景一致:(1)您希望
A
首先分布在不同的地区,还是分布在单个地区?(2)步骤2中的工作对于1..M中的每个参数大致相同,还是会有所不同?(3)如果Q1的答案是“分布的”,您希望第2步中的计算作用于A的本地块,还是可能作用于远程块或分布式块?谢谢。您好@Brad,谢谢您的评论。(1)Prefrable A在本地分布,因为它可以很容易地增长到几个TB。(2)这几乎是同样的努力。(3)第二步需要位于远程块中的解决方案,但不是所有的解决方案。顺便说一句,我不是一个如此权威的人,但是如果你的问题更具体地针对所问的主题,那么你的问题可能对其他人更有价值,因为有人可能想知道许多不同类型的复杂并行计算。例如。,“教堂子阵列的有效传输”?或“教堂子阵列的有效定位”。。。“?谢谢你的建议。是的,标题应该更具体。首先,谢谢你的努力。这对我来说绝对是一个很好的线索。我可能需要一些时间来消化,因为我对这门语言还不熟悉。对你来说。1.1..m应该作为a[I,:,:]在当地人中分发这是矩阵方程的解。2.我可以定义第二步1..M中每个I需要的张量索引。因此我认为这是可行的。3.这是可取的,因为它会减少内存使用。4.这有什么好处?我认为这不会有什么坏处,因为需要的索引不一定是一个切片。Addressing第1点和第4点:仅分布1..M维度的两种主要方法是将其声明为分布到其他维度中退化的区域设置的3D数组(请参见);另一种是将其声明为本地2D阵列的分布式1D阵列。权衡主要是在风格和性能上。如果认为空间在3D中是连续的,那么最好选择第一种