我有一个用 C++ 编写的高性能动态程序,它的结果放在一个 M × N 表中,大约是 2000 行 × 30000 列。
每个条目(r,c)取决于表中其他几列中的几行。
跨P个处理器并行计算行r的最明显方法是静态分区数据:即,让处理器p计算所有有效k的条目 (r, p + k P ) 。
但是,不同列的条目计算时间略有不同(例如,一个可能需要五倍于另一个),所以我想动态分区数据以获得更好的性能,通过避免停滞提前完成的 CPU 反而让它们从仍在追赶的 CPU 中窃取工作。
解决此问题的一种方法是保留一个原子全局计数器,该计数器指定已计算的列数,并在每次 CPU 需要更多工作时增加它。但是,这会强制所有 CPU 在计算表中的每个
条目后
访问相同的全局计数器- 即,它在一定程度上序列化程序。由于计算每个条目或多或少是一个快速的过程,这在某种程度上是不可取的。
所以,我的问题是:
有没有办法以更可扩展的方式执行这种动态分区(即在计算每个条目后不必访问单个全局计数器)?