以 std::span 的形式访问 std::mdspan 的一行

Accessing a row of a std::mdspan as std::span

提问人:PluginPenguin 提问时间:8/15/2023 最后编辑:PluginPenguin 更新时间:10/7/2023 访问量:201

问:

我正在尝试 Kokkos 参考 mdspan 实现,看看它是否可用于简化我们代码库中的一些代码。我直觉上认为可能的一件事是选择一行二维并将其分配给 ,例如有点像std::mdspanstd::span

float* data = ...

std::mdspan matrix (data, 2, 5);

std::span vector = matrix[0]; // <-- should be a std::span<float, std::dynamic_extent> viewing row 0 of matrix

经过一番研究,我没有找到一种明显直接的方法来实现这一目标,无论是使用 mdspan 的成员函数还是使用 std 库中的免费函数。目前我看到的唯一可能性是回到原始指针级别并编写自己的自由函数来做到这一点,这并不像我预期的那么优雅。我是否忽略了某些东西,或者这真的没有 mdspan 的功能?

C++ C++23 MDSPAN

评论

2赞 康桓瑋 8/15/2023
也许 submdspan 可以提供帮助。
0赞 PluginPenguin 8/15/2023
谢谢,但这并不能直接转换为 ,对吧?std::span
1赞 Mestkon 8/15/2023
不能方便地成为模板参数,因为它是运行时变量。通过将 5 提供给构造函数,没有合理的方法可以在编译时意识到第二个范围始终具有 5 个元素。你在这里能做的最好的事情是。5matrixmdspanstd::span<float, std::dynamic_extent>
0赞 PluginPenguin 8/15/2023
啊,是的,当然@Mestkon。我知道这一点,在上面的问题中修复了它

答:

2赞 康桓瑋 10/7/2023 #1

您可以通过 C++26 std::submdspan() 将原始 2d- 切片为 1-d。mdspanmdspan

由于结果的基础序列是连续的,因此可用于构造mdspanstd::span

float* data = ...;

std::mdspan matrix(data, 2, 5);

std::mdspan row0 = std::submdspan(matrix, 0, std::full_extent);
std::span vector0(row0.data_handle(), row0.size()); // row 0 of matrix

std::mdspan row1 = std::submdspan(matrix, 1, std::full_extent);
std::span vector1(row1.data_handle(), row1.size()); // row 1 of matrix

使用参考 mdspan 实现演示