缓存友好的方式从多个线程收集结果

Ser*_*tch 7 c++ optimization x86 multithreading cpu-cache

考虑N线程执行一些具有小结果值的异步任务,如doubleint64_t.因此,8结果值可以适合单个CPU缓存行.N等于CPU核心数.

一方面,如果我只是分配一个N项目数组,每个a double或者int64_t,那么8 线程将共享一个CPU缓存行,这似乎效率低下.

另一方面,如果我为每个double/ 分配一个完整的缓存行int64_t,接收器线程将必须获取N缓存行,每个缓存行由不同的CPU核心(1除外)写入.

那么这种情况是否有效的解决方案?CPU是x86-64.C++中的解决方案是首选.

澄清1:线程启动/退出开销不大,因为使用了线程池.所以它主要是关键部分的同步.

澄清2:并行批次具有依赖性.主线程只能在收集并处理上一批次的结果后才能启动下一批并行计算.因为前一批次的结果用作下一批次的一些参数.

Wal*_*ter 1

如果工作线程的访问/写入次数远远超过向头/主线程报告/读取的结果,则

  • 您必须避免工作人员之间的错误共享(使用公共缓存行)。这应该通过在内部工作中使用自动变量(实际上可以仅实现为寄存器)来完成。
  • 将结果传送回主线程(或从主线程传送输入)对效率的要求较低,并且可以使用数组(即公共高速缓存线)。在这里,您可以简单地尝试一下最有效的方法。