【问题标题】:Use TBB to create a vector in parallel使用 TBB 并行创建向量
【发布时间】:2019-12-13 16:28:23
【问题描述】:

我有一个vector<int> foo 和一个函数float bar(int)。使用algorithms 库,我可以使用

填充vector<float> quux
transform(foo.begin(), foo.end(), quux.begin(), bar);

我的foo 函数恰好非常慢,我希望使用 TBB 库在多个线程中并行化此代码。我会认为这将是一个理想的情况,因为所有操作都是独立的。但是,似乎没有parallel_transform 算法。我用parallel_for 算法看到的每个示例都将数据放回原始数组中,但我不能这样做,因为我正在更改类型。

【问题讨论】:

  • 只需使用foo 的内容初始化quux 并正常转换。
  • 虽然这在这种特定情况下有效,但对于 foo 是浮点数、quux 是整数和 bar 将浮点数转换为整数的相反情况,它将失败。我想知道是否有更通用的解决方案
  • std::transform 具有并行执行的重载。它在标准库中。它在视觉工作室上运行良好。我不知道其他编译器套件。也许他们缺乏对这个功能的支持。
  • @phön 是的,这是 C++17 的功能。目前支持有所不同。 GCC 9.1 使用 TBB 支持它(因此需要安装并链接 TBB 才能工作)。

标签: c++ parallel-processing tbb


【解决方案1】:

您可以使用对目标的引用来实现它。示例代码:

std::vector<float> quux(foo.size());
parallel_for(size_t(0), foo.size(), [&foo,&quux] (size_t i) {
    quux[i] = bar(foo[i]);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多