并行化大型动态程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并行化大型动态程序相关的知识,希望对你有一定的参考价值。
我在C ++中有一个高性能的动态程序,其结果放在一个M×N表中,大约大约2000行×30000列。 每个条目(r,c)取决于表中其他几列中的一些行。
并行化跨越P个处理器的行r的计算的最明显的方法是静态地划分数据:即,使处理器p计算所有有效k的条目(r,p + k P)。
但是,不同列的条目需要稍微不同的计算时间(例如,一个可能需要五倍于另一个),因此我想动态分区数据以获得更好的性能,避免停止早期完成并让他们从正在赶上的CPU中窃取工作的CPU。
解决此问题的一种方法是保留一个原子全局计数器,该计数器指定已计算的列数,并在每次CPU需要更多工作时增加它。 但是,这会强制所有CPU在计算表中的每个条目后访问同一个全局计数器 - 即,它在某种程度上序列化程序。由于计算每个条目或多或少是一个快速的过程,这在某种程度上是不可取的。
所以,我的问题是: 有没有办法以更可扩展的方式执行此动态分区(即,在计算每个条目后无需访问单个全局计数器)?
我假设您正在为新值使用第二个数组。如果是这样,这听起来像是TBB或Cilk Plus的循环结构。两者都使用worktealing在可用处理器之间分配工作,当一个处理器用完工作时,它将从有可用工作的处理器窃取工作。这平衡了数据的“厚度”。
要使用Cilk,您需要一个支持Cilk Plus的commpiler。 GCC 4.9和英特尔编译器都支持它。通常你会写一些类似的东西:
cilk_for (int x = 0; x < XMAX; x++) {
for (int y = 0; y < YMAX; y++) {
perform-the-calculation;
}
}
TBB的构造类似。
另一种方法是以缓存无关的方式“平铺”计算。也就是说,您实现了自己的分而治之算法,该算法将计算分解为具有缓存效率的块。有关缓存遗忘算法的更多信息,请参阅http://www.1024cores.net/home/parallel-computing/cache-oblivious-algorithms/implementation。
巴里
以上是关于并行化大型动态程序的主要内容,如果未能解决你的问题,请参考以下文章