【问题标题】:tbb::parallel_for with preserved ordertbb::parallel_for 保留顺序
【发布时间】:2023-03-27 17:14:01
【问题描述】:

我有一个要并行化的循环。该循环意味着执行以下操作:

std::vector<int> input = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> output;
for(size_t i(0); i < input.size(); ++i)
{
    output.emplace_back(input[i] * 2);
}

但是,我想保留输出中的顺序。我尝试使用 tbb::enumerable_thread_specific 来做到这一点:

tbb::enumerable_thread_specific<std::vector<int>> threadData;
tbb::parallel_for(size_t{0}, input.size(), [&](size_t i)
{
    auto& local = threadData.local();
    local.emplace_back(2 * input[i]);
});

for (const auto& local : threadData)
{
    output.insert(output.begin() + output.size(), local.begin(), local.end());
}

但是,订单不会被保留。我还尝试指定分区器:

tbb::static_partitioner()

但它也没有帮助。

在保持输出顺序的同时并行化 for 循环的正确方法是什么?

【问题讨论】:

    标签: c++ parallel-processing tbb thread-local-storage


    【解决方案1】:

    在保持给定顺序的同时并行执行任务通常很难(而且并非总是可能),因为这通常意味着某些事情应该按顺序完成。

    借助直接索引,您可以轻松解决此问题:

    std::vector<int> input = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<int> output(input.size());
    
    tbb::parallel_for(size_t{0}, input.size(), [&](size_t i)
    {
        output[i] = input[i] * 2;
    }
    

    请记住,在并行上下文中调整向量的大小(以及更普遍地处理动态大小的数据)通常是一个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多