如何在多核系统中访问共享内存

时间:2011-09-21 13:32:08

标签: c multithreading multicore

在多核系统中,例如2,4或8核,我们通常使用互斥锁和信号量来访问共享内存。但是,我可以预见,这些方法会为具有许多内核的未来系统带来很高的开销。是否有任何替代方法可以更好地用于未来许多用于访问共享存储器的核心系统。

4 个答案:

答案 0 :(得分:6)

Transactional memory就是这样一种方法。

答案 1 :(得分:2)

我不确定您将来会走多远。但是从长远来看,我们现在所知道的共享内存(任何内核都可以访问单个地址空间)是不可扩展的。所以编程模型必须在某个时刻发生变化,并使程序员的生活变得更加艰难,就像我们进入多核时一样。

但是现在(可能还有10年)你可以逃脱交易记忆和其他硬件/软件技巧。

我说共享内存长期不可扩展的原因仅仅是物理原因。 (类似于单核/高频如何击中障碍)

简而言之,晶体管不能缩小到小于原子的尺寸(除非采用新技术),并且信号的传播速度不会超过光速。因此,内存将变得越来越慢(相对于处理器),在某些时候,共享内存变得不可行。

我们现在已经可以在多插槽系统上使用NUMA看到这种效果了。大型超级计算机既不是共享内存也不是缓存一致的。

答案 2 :(得分:0)

1)仅锁定您正在访问的内存部分,而不是整个表!这是在一个大哈希表的帮助下完成的。桌子越大,锁机制越精细。

2)如果可以的话,只能锁定写入而不是读取(这要求在更新时读取“之前的值”没有问题,这通常是有效的情况)。

答案 3 :(得分:0)

在任何多处理器/核心/线程应用程序同步中访问最低级别的共享内存取决于总线锁定。这种锁可能会产生数百个(CPU)等待状态,因为它还包括锁定那些具有总线主控设备(包括DMA)的I / O总线。从理论上讲,可以设想一种中级锁,当程序员确定被锁定的存储区不会受到任何I / O总线的影响时,可以调用该锁。这样的锁定会快得多,因为它只需要将CPU高速缓存与主存储器同步很快,至少与最慢的I / O总线的延迟相比。程序员是否能够确定何时使用哪种总线锁会增加其主流可行性的令人担忧的影响。这种锁也可能需要自己专用的外部引脚来与其他处理器同步。

在多处理器Opteron系统中,每个处理器都有自己的内存,成为整个内存的一部分,所有安装的处理器都可以“看到”。试图访问附加到另一个处理器的内存的处理器将通过高速互连总线(称为HyperTransport)透明地完成访问 - 尽管更慢 - 通过负责该内存的处理器(NUMA概念)。只要处理器及其内核与物理连接的内存一起工作,处理速度就会很快。此外,许多处理器都配备了多个外部存储器总线,以增加其总存储器带宽。

Opteron系统上的理论中级锁定可以使用HyperTransport互连实现。

对于任何可预见的未来,通过实现锁定到位时使用的有效算法(和相关数据结构)尽可能少且尽可能短时间锁定的经典方法仍然适用。