c++ - 我们如何并行运行 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
可用。
那么,我们怎样才能以更好的方式做到这一点呢?
解决方案
无法将此纳入评论:
除了将 N 个函数传递给 N 个数据点(X)的 M 个线程外,您还可以:
- K个队列,每个队列有N/K个数据元素
- 池中的 M 个线程(生产者,准备好具有相同的功能)
- 1 个消费者(加法器)线程(主线程?)
并且只在线程之间传递 N 个数据点。传递函数并执行它们可能会产生比数据更多的开销。
此外,这些函数可以添加到共享变量中,而无需任何额外的外部求和,然后只有 M 个生产者可以使用合适的同步,例如原子或锁守卫。
该结构的 sizeof 是多少?
推荐阅读
- c# - 共享项目中的 C#/Xamarin 常量
- android - 将 minSdkVersion(21) 更改为 (18) < 设备的 API (19) 但项目停止运行
- r - R:堆积面积图不堆积
- javascript - 正则表达式与比较运算符在 vs 逻辑运算符 OR - MongoDB
- php - 从数组中获取所有值
- c# - 使用 System.ServiceModel.ClientBase 将纯 XML 作为值发送
- visual-studio-code - 如果使用 RxJS 的 shareReplay 运算符,则在 mocha 中的测试未完成
- c# - 如何读取和处理属于一起的多行?
- java - 如何使用 CriteriaBuilder 从数据库中的现有表中检索数据,但不使用休眠中的 pojo 类?
- neural-network - 如何使用 keras 获得每一层的输出值?