std::mdspan 步幅布局策略

std::mdspan stride layout policy

提问人:Marius Bancila 提问时间:4/11/2023 最后编辑:Marius Bancila 更新时间:4/11/2023 访问量:238

问:

我想了解政策是如何运作的。此时,没有编译器支持这种新的 C++23 库类型,尽管存在一个参考实现:https://github.com/kokkos/mdspan。但是,无论是在 github wiki(mdspan 的温柔介绍)还是 P0009r18 论文上,我都找不到关于这种布局类型的良好解释。std::layout_stridestd::mdspan

以下程序,使用(默认)进行打印std::layout_rightmdspan

1 2 3
4 5 6
std::vector v {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
std::mdspan<int, 
            std::extents<size_t, 2, 3>,
            std::layout_right> mv{v.data()};
for (std::size_t r = 0; r < mv.extent(0); r++)
{
  for (std::size_t c = 0; c < mv.extent(1); c++)
  {
     std::cout << mv[r, c] << ' ';
  }
  std::cout << '\n';
}

如果我们更改为 ,则输出变为:std::layout_left

1 3 5
2 4 6
std::mdspan<int, 
            std::extents<size_t, 2, 3>,
            std::layout_left> mv{v.data()};

我的理解是可以控制步幅。例如,每 2 个元素(从底层序列)跳转行,每 3 个元素跳转列。但是,我没有找到任何关于此事的例子。有没有人举例说明这是如何工作的?std::layout_stride

它可以在这里在 godbolt 上进行实验:https://godbolt.org/z/Mxa7cej1a

更新

根据@KamilCuc的回答,我推断出以下内容:

    stdex::mdspan<int, 
                  stdex::extents<size_t, stdex::dynamic_extent, stdex::dynamic_extent>, 
                  stdex::layout_stride> 
    mv{ v.data(), 
       { stdex::dextents<size_t,2>{2, 3}, 
         std::array<std::size_t, 2>{3, 1}}};

结果:

1 2 3
4 5 6

这相当于 。layout_right

跨:std::array<std::size_t, 2>{1, 1}

1 2 3
2 3 4

跨:std::array<std::size_t, 2>{3, 2}

1 3 5
4 6 8

跨:std::array<std::size_t, 2>{9, 3}

 1  4  7
10 13 16
C++ C++23 MDSPAN

评论

0赞 KamilCuk 4/11/2023
github.com/kokkos/mdspan/blob/...... github.com/kokkos/mdspan/blob/...... github.com/kokkos/mdspan/blob/......整体 github.com/kokkos/mdspan/search?p=2&q=layout_stride
0赞 Marius Bancila 4/11/2023
谢谢。我看过前两个,我错过了最后一个。有一个例子可以借鉴。
0赞 Cris Luengo 6/10/2023
请将更新作为答案发布,而不是编辑问题。

答: 暂无答案