提问人:Marius Bancila 提问时间:4/11/2023 最后编辑:Marius Bancila 更新时间:4/11/2023 访问量:238
std::mdspan 步幅布局策略
std::mdspan stride layout policy
问:
我想了解政策是如何运作的。此时,没有编译器支持这种新的 C++23 库类型,尽管存在一个参考实现:https://github.com/kokkos/mdspan。但是,无论是在 github wiki(mdspan 的温柔介绍)还是 P0009r18 论文上,我都找不到关于这种布局类型的良好解释。std::layout_stride
std::mdspan
以下程序,使用(默认)进行打印std::layout_right
mdspan
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
答: 暂无答案
评论