我在 Visual C++ 文档中读到,多个线程读取同一对象是安全的。

我的问题是:多核 X86-64 CPU 如何处理这个问题?

假设您有一个 1 MB 的内存块。不同的线程实际上能够同时读取完全相同的数据,还是内核一次只能读取一个字,而一次只允许一个内核读取特定的字?

有帮助吗?

解决方案

不仅允许从存储器的同一块读取不同的核,他们允许在同一时间写入太。如果它是“安全”与否,这是一个完全不同的故事。您需要实现某种形式的保护在你的代码(通常与信号量或它们的衍生物进行),以防止多个内核的方式,你不必特别允许争夺相同的内存块。

关于芯每次读取的存储器的大小,这是通常的寄存器的价值,在一个32位CPU 32位,对64位的CPU 64位,依此类推。即使流是由DWORD DWORD进行(看的memcpy例如)。

关于多个核真如何并发是,各芯使用单个总线读取和写入到存储器,所以在访问任何资源(RAM,外部装置,浮点处理单元)是一次一个请求,一个芯在一个时间。核心内的实际处理是完全并发但是。 DMA传输也不会阻塞总线,并发传输得到排队,并且在时刻(I相信,不是100%在此肯定)。

处理的一个

编辑:刚刚澄清,这里不像其他的答复,我只谈论一个无缓存的情况。当然,如果存储器被缓存的只读访问是完全同时的。

其他提示

如果您的 1MB 块中确实没有写入,那么是的,每个核心都可以毫无问题地从自己的缓存行读取,因为没有提交写入,因此不会出现缓存一致性问题。

在多核架构中,基本上每个核心都有一个缓存,并且有一个“缓存一致性协议”,该协议会使某些不具有最新信息的核心上的缓存失效。我认为大多数处理器都实现了 MOESI协议 为了缓存一致性。

缓存一致性是一个复杂的话题,已经被广泛讨论(我特别喜欢 Joe Duffy 的一些文章) 这里这里)。尽管如此,讨论仍然围绕着代码可能的性能损失,虽然显然是无锁的,但由于缓存一致性协议启动以维持处理器缓存之间的一致性,可能会减慢速度,但是,只要没有写入,就根本没有保持一致性,从而不会损失性能。

只是为了澄清,正如评论中所述,RAM 无法同时访问,因为 x86 和 x64 架构实现了在内核之间共享的单个总线 表面活性剂 保证访问主存的公平性。尽管如此,这种情况被每个核心缓存隐藏起来,这允许每个核心拥有自己的数据副本。对于 1MB 的数据,当核心更新其缓存时可能会引发一些争用,但这可以忽略不计。

一些有用的链接:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top