“良好并行化”的算法没有被多线程加速

时间:2013-01-24 20:04:25

标签: parallel-processing

我很遗憾地问一个我不太了解的话题,但是这个想法确实让我烦恼,我无法在互联网上找到任何答案。

背景 我正在和一位从事计算机科学研究的朋友谈话。我主要是临时开发,因此我对大多数CS概念的理解处于功能级别(我知道如何使用它们而不是它们如何工作)。他说,将在单个线程上运行的“良好并行化”的算法转换为在多个线程上运行的算法并不会导致处理速度的提高。

推理: 我问他运行这个算法的计算机的架构是什么,他说16核(非虚拟化)。根据我对多核处理器的了解,在多核上运行的算法的处理速度增长应该与它的并行化程度大致成正比。

问题: 一个“良好并行化”并正确编程以在真正的多核处理器上运行的算法如何能够快速运行几倍?是否有一些我在这里缺少的信息,或者更可能是实施方面的问题?

其他东西:我询问线程是否可能占用的功率超过任何单个核心可用的功率,显然每个核心运行频率为3.4 GHz。这远不是算法所需要的,并且在运行诊断时,核心在运行期间不会被最大化。

2 个答案:

答案 0 :(得分:2)

可能会共享某些内容。分享的内容可能并不明显。

最常见的非显而易见的共享资源之一是CPU缓存。如果线程正在更新缓存行必须在CPU之间跳转的同一缓存行,则会减慢所有内容。

由于访问内存中彼此接近的(甚至是只读的)变量,可能会发生这种情况。如果所有访问都是只读的,那就没问题,但即使一个CPU写入该缓存行也会强制反弹。

解决这个问题的强力方法是将共享变量放入看起来像这样的结构中:

struct var_struct {
    int value;
    char padding[128];
};

您可以研究哪种系统参数或预处理器宏定义系统类型的缓存行大小,而不是硬编码128.

可以进行共享的另一个地方是系统调用。即使是看似无辜的功能也可能会占据全球锁定。我似乎回忆起关于Linux修复这样一个问题的问题,一段时间以来锁定了返回进程和线程标识符以及父标识符的函数。

答案 1 :(得分:0)

性能与核心数量通常是类似S的曲线 - 首先它显然会增加但是由于锁定,共享缓存等会带来债务,因此进一步的核心不会增加太多,甚至可能会降低。因此没什么神秘的。如果我们知道有关该算法的更多细节,可能会找到加速它的想法。