带执行策略的std::exclusive_scan无法原地工作:是文档还是实现Bug?
关于std::exclusive_scan原地使用的libstdc++实现问题
cppreference对std::exclusive_scan的参数d_first有如下说明:
d_first - 目标范围的起始位置;可以与first相等
按照这个描述,以“原地”模式使用std::exclusive_scan覆盖原有存储应该是完全合法的。但在GCC 12.2.0附带的libstdc++实现中,带执行策略的重载版本却无法正常工作——哪怕使用的是顺序执行策略std::execution::seq也是如此。
以下是复现问题的示例代码:
#include <algorithm> #include <numeric> #include <execution> #include <vector> #include <cassert> int main() { const int size = 10; std::vector<int> vec(size); // 无执行策略 std::fill(vec.begin(), vec.end(), 1); std::exclusive_scan(vec.begin(), vec.end(), vec.begin(), 0); assert(vec[0] == 0); // 第一个元素应为0 assert(vec[size-1] == size-1); // 最后一个元素应为总和 // 顺序执行策略 std::fill(vec.begin(), vec.end(), 1); std::exclusive_scan(std::execution::seq, vec.begin(), vec.end(), vec.begin(), 0); assert(vec[0] == 0); // 第一个元素应为0 assert(vec[size-1] == size-1); // 最后一个元素应为总和 // 并行执行策略 std::fill(vec.begin(), vec.end(), 1); std::exclusive_scan(std::execution::par, vec.begin(), vec.end(), vec.begin(), 0); assert(vec[0] == 0); // 第一个元素应为0 assert(vec[size-1] == size-1); // 最后一个元素应为总和 }
需要明确的是:原地并行的exclusive_scan算法是可以实现的。那么当前出现的问题,究竟是cppreference文档的描述错误,还是libstdc++的实现Bug?
注:已知Stack Overflow上有相关问题,但该问题并未涉及Bug相关的疑问。
内容的提问来源于stack exchange,提问作者Jakub Klinkovský
相关产品推荐
相关产品推荐

