tbb::parallel_for 保留顺序

问题描述

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

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 循环的正确方法是什么?

解决方法

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

在这里,您可以通过直接索引轻松解决这个问题:

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;
}

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...