0

我很抱歉提出一个我知之甚少的话题,但这个想法确实困扰着我,我无法在互联网上找到任何答案。

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

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

问题: “良好并行化”并正确编程以在真正的多核处理器上运行的算法怎么能不快几倍?是否有一些我在这里遗漏的信息,或者更可能是实施的问题?

其他东西:我问线程是否可能比任何单个内核可用的功率都多,显然每个内核都运行在 3.4 GHz。这远远超出了算法应该需要的范围,并且在运行诊断时,内核不会在运行时达到最大值。

4

2 回答 2

2

这很可能是共享的东西。共享的内容可能并不明显。

最常见的非显而易见的共享资源之一是 CPU 缓存。如果线程正在更新相同的缓存线,那么缓存线必须在 CPU 之间反弹,从而减慢一切。

这可能是因为访问(甚至是只读)在内存中彼此靠近的变量。如果所有访问都是只读的,那没关系,但即使一个 CPU 正在写入该缓存行,它也会强制反弹。

解决此问题的蛮力方法是将共享变量放入如下结构中:

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

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

另一个可以进行共享的地方是系统调用内部。即使是看似无辜的函数也可能使用全局锁。我似乎记得在不久前阅读过有关 Linux 通过锁定返回进程和线程标识符以及父标识符的函数来解决此类问题的文章。

于 2013-01-24T21:57:03.817 回答
0

性能与内核数量的关系通常是一个 S 形曲线——首先它明显增加,但随着锁定、共享缓存等的出现,它们欠下更多的内核并没有增加太多,甚至可能会降级。因此没有什么神秘的。如果我们能了解更多关于算法的细节,就有可能找到一个想法来加速它。

于 2013-01-24T20:17:59.170 回答