You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带执行策略的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ý

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:40:48