首页 > 解决方案 > 我们如何并行运行 n 个算法实例并以有效的方式计算结果函数的平均值?

问题描述

我想n并行运行算法实例并计算f结果函数的平均值。如果我没有大错特错,下面的代码实现了这个目标:

struct X {};
int f(X) { return /* ... */; }

int main()
{
    std::size_t const n = /* ... */;
    std::vector<std::future<X>> results;
    results.reserve(n);

    for (std::size_t i = 0; i < n; ++i)
        results.push_back(std::async([]() -> X { /* ... */ }));

    int mean = 0;
    for (std::size_t i = 0; i < n; ++i)
        mean += f(results[i].get());
    mean /= n;
}

但是,有没有更好的方法来做到这一点?上面代码的明显问题如下: 行中求和的顺序mean += f(results[i].get());无关紧要。因此,最好在结果mean可用时立即添加。如果在上面的代码中,i第 th 任务的结果尚不可用,则程序会等待该结果,而任务的所有结果可能i + 1已经n - 1可用。

那么,我们怎样才能以更好的方式做到这一点呢?

标签: c++multithreadingasynchronousparallel-processingc++17

解决方案


无法将此纳入评论:

除了将 N 个函数传递给 N 个数据点(X)的 M 个线程外,您还可以:

  • K个队列,每个队列有N/K个数据元素
  • 池中的 M 个线程(生产者,准备好具有相同的功能)
  • 1 个消费者(加法器)线程(主线程?)

并且只在线程之间传递 N 个数据点。传递函数并执行它们可能会产生比数据更多的开销。

此外,这些函数可以添加到共享变量中,而无需任何额外的外部求和,然后只有 M 个生产者可以使用合适的同步,例如原子或锁守卫。

该结构的 sizeof 是多少?


推荐阅读