【问题标题】:C++ AMP nested loopC++ AMP 嵌套循环
【发布时间】:2014-03-06 09:06:14
【问题描述】:

我正在从事一个需要大量并行计算的项目。然而,棘手的问题是,该项目包含一个嵌套循环,如下所示:

for(int i=0; i<19; ++i){
    for(int j=0; j<57; ++j){
        //the computing section
    }
}

为了获得最高收益,我需要并行化这两个级别的循环。像这样:

parallel_for_each{
    parallel_for_each{
        //computing section
    }
}

我测试并发现 AMP 不支持嵌套 for 循环。有人对这个问题有任何想法吗?谢谢

【问题讨论】:

    标签: c++ parallel-processing gpu gpgpu c++-amp


    【解决方案1】:

    正如@High Performance Mark 建议的那样,您可以将两个循环合二为一。但是,您不需要使用 C++ AMP 执行此操作,因为它在 arrays 和 array_views 上支持 2 维和 3 维 extents。您可以使用index 作为多维索引。

    array<float, 2> x(19,57);
    parallel_for_each(x.extent, [=](index<2> idx) restrict(amp)
    {
        x[idx] = func(x[idx]);
    });
    
    float func(const float v) restrict(amp) { return v * v; }
    

    您可以使用以下方法访问idx 中的各个子索引:

    int row = idx[0]; 
    int col = idx[1];
    

    您还应该考虑computing section 所做的工作量。如果它相对较小,您可能希望每个线程处理多个数组元素x

    下面的文章也值得一读,就像 CPU 一样,如果你的循环不能有效地访问内存,它会对性能产生很大影响。 Arrays are Row Major in C++ AMP

    【讨论】:

      【解决方案2】:

      所以折叠循环:

      for(int ij=0; ij<19*57; ++ij){
              //if required extract i and j from ij
              //the computing section
          }
      }
      

      【讨论】:

      • 你可以,我怀疑这就是你在 CUDA 中的做法。然而,C++ AMP 对此有一个更简单的方法。看我的回答。
      猜你喜欢
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2014-09-14
      • 2017-07-08
      • 2015-05-29
      相关资源
      最近更新 更多