gpt4 book ai didi

parallel-processing - Chapel中分散子阵列的有效收集和转移

转载 作者:行者123 更新时间:2023-12-03 23:46:46 25 4
gpt4 key购买 nike

最近,我遇到了教堂。我喜欢教程中给出的示例,但在我看来,其中许多示例令人尴尬。我正在研究多体量子物理学中的散射问题,一个常见问题可以简化为以下问题。

  • 张量 A 形状 M x N x N用矩阵方程的解来填充 M不同的参数1..M
  • 张量的子集 A 需要计算修正项
    每个参数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 分布式数组表示法的任何开销。

    迄今为止,我们主要专注于优化块分布式阵列的此类传输。例如,对于上例这样的情况,当 myDistArray 是块分布的时,当我改变切片的大小时,我看到语言环境之间的通信数量是固定的(尽管这些通信的大小显然会因需要传输的元素数)。已知其他情况和模式需要更多优化工作,因此如果您发现某个情况未按预期执行/扩展,请提交 Chapel GitHub issue反对它以帮助提醒我们您的需求和/或帮助您找到解决方法。

    所以,勾勒出你描述的模式,我可能会想象做这样的事情:
    // 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
  • 的平面之间存在对应关系,这可能是一种减少所需通信量的方法。
  • 还有一些方法可以就地引用分布式数组切片和/或给它一个符号名称,而不是像上面建议的那样创建它的本地副本
  • 如果需要/首选,可以将 A 声明为二维数组的一维分布式数组,但如果您想访问空间的 3D 切片,这可能不太好

  • (因此,如果您对这些感兴趣,请随时提出后续问题)

    最后,为了后代,这是我在将这个响应放在一起时编写的程序,以确保我在通信数量和获取本地数组方面得到我预期的行为(这是与 chpl version 1.23.0 pre-release (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());

    关于parallel-processing - Chapel中分散子阵列的有效收集和转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62269112/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com