我有一个双插槽 8 核处理器,即每个处理器都有 4 核。我还没有完全看到它的规范,但我认为一个单独的内存库以 ccNUMA 方式连接到每个处理器,因此从另一个处理器的内存库访问相对较慢。我想他们也有不同的 L3 缓存。
现在我的问题是在两个处理器之间共享数据的最快方法是什么。由于 ccNUMA 和缓存一致性,简单的共享内存会出现问题。有什么方法非常快吗?
我有一个双插槽 8 核处理器,即每个处理器都有 4 核。我还没有完全看到它的规范,但我认为一个单独的内存库以 ccNUMA 方式连接到每个处理器,因此从另一个处理器的内存库访问相对较慢。我想他们也有不同的 L3 缓存。
现在我的问题是在两个处理器之间共享数据的最快方法是什么。由于 ccNUMA 和缓存一致性,简单的共享内存会出现问题。有什么方法非常快吗?
这在很大程度上取决于您要实施的内容的性质。从我所看到的情况来看,与使用 MPI 相比,使用非常严格管理的共享内存方法通常可以做得更好。(因为使用共享内存可以做更多事情)
但是,MPI 很难完全出错,因为对于 X 为何表现良好的猜测工作要少得多。
以下是使用共享内存的一些常见方法:
只读数据:如果数据足够小,最好在所有节点上复制它。
如果您的内存访问具有极高的不会“迁移”的空间局部性,请组织您的数据,使每个“组”空间局部性访问都在同一个节点上。
如果您的内存访问模式表现出较高的时间局部性,但空间局部性不足以放入缓存中,那么请考虑将数据复制到本地缓冲区中。工作完成后,将其复制回来。这使您可以保持程序的相同结构。
编辑:考虑在您的问题中添加“NUMA”标签。
OpenMP 和 OpenMPI 都允许跨多个 CPU 共享数据。我想使用这些 API 之一可能比您尝试自己实现的任何东西都要快。您使用哪一个将取决于您尝试实现的确切性质。