【发布时间】:2015-03-14 09:53:09
【问题描述】:
我有一个高性能的 C++ 动态程序,它的结果放在一个 M × N 表中,大约是 2000 行 × 30000 列。
每个条目(r、c)都依赖于表中其他几列中的几行。
跨P个处理器并行计算行r的最明显方法是静态对数据进行分区:即,有处理器p 计算所有有效 k 的条目 (r, p + k P) .
但是,不同列的条目计算时间略有不同(例如,一个可能需要五倍于另一个),所以我想动态地对数据进行分区为了获得更好的性能,通过避免提前完成的 CPU 停顿并让它们从仍在追赶的 CPU 中窃取工作。
解决此问题的一种方法是保留一个原子全局计数器,该计数器指定已计算的列数,并在每次 CPU 需要更多工作时增加它。
但是,这会强制所有 CPU 在计算表中的 每个 条目后访问 same 全局计数器 - 即,它在一定程度上序列化程序。由于计算每个条目或多或少是一个快速的过程,这有点不可取。
所以,我的问题是:
有没有办法以更具可扩展性的方式执行这种动态分区(即在计算每个条目后不必访问单个全局计数器)?
【问题讨论】:
-
你有没有想过使用 GPU。 CUDA 浮现在脑海中
-
@EdHeal:我有,但是 (1) 我并不真正了解 GPU 编程,并且 (2) 我的理解是 GPU 不适合这样的计算,其中计算量因其他因素而异(例如,依赖项的数量因行和列而异)。
-
"在计算 每个 条目之后" - 为什么不修复粒度?以更大的块分配任务。
标签: c++ parallel-processing dynamic-programming work-stealing