【问题标题】:Shared memory model and distributed memory model共享内存模型和分布式内存模型
【发布时间】:2018-12-02 08:28:23
【问题描述】:

假设您的 CPU 在逻辑门中具有以下当前硬件架构:

假设我们有一个共享内存模型和分布式模型:

如果我们想要实现共享内存模型和并行进程线程,是否需要一些实用程序,例如 OpenMP。共享内存是 L3 缓存还是 RAM 主内存?而要实现分布式内存模型,我们需要一些实用程序,例如 MPI 和多个计算系统(计算机)?

【问题讨论】:

  • 您对分布式 L1/2 缓存有疑问吗?
  • 我试图了解这些内存模型如何转化为真正的硬件逻辑组件。共享内存模型上的内存是主存还是共享三级缓存?
  • 不,主内存通常是主内存。事实上,并行执行与缓存无关,如果缓存是有益的,那么是优化编译器的结果,而不是并行库的结果。分布式内存模型假设不同的地址空间和所有,您可以使用 MPI(最好)或结合管道的原始进程。
  • 那么什么是共享内存?它必须是 RAM,当机器被加载并运行时,操作系统会创建一个带有虚拟内存的进程,一个主线程执行,辅助线程从这个主线程执行,它们可以访问进程共享资源....
  • 共享内存是指拥有一大块内存,“许多”进程可以以读、写或两者的方式访问。通过并行执行共享内存并不意味着“分布式”。也就是说,您可以认为分布式系统只是包括所有内核和进程的更大系统的一部分,那么共享内存需要“分布式”,但这仍然意味着可以被(大型)系统中的任何进程访问.此模型不涉及缓存,即使它可能会产生影响(需要保持整个共享区域的一致性,有时可能会使缓存失效......)

标签: c++ memory parallel-processing shared-memory


【解决方案1】:

是的,就是这样,直到您开始使用 NUMA。

所以让我们从头开始吧。如果您的内核共享相同的内存空间,那么您可以使用线程和库/工具,如 OpenMP 或 TBB(如果您使用 C++,请使用 TBB,而不是 OpenMP)。您也可以在此处使用 MPI。

如果你有互连,那么唯一的选择就是使用像 MPI 这样的库。

现在,有一种介于两者之间的情况,即非统一内存架构。例如,如果您有两个套接字,这意味着两个内存空间都连接到一个套接字并且仍然可以从另一个套接字访问,并且如果您有一个程序在多套接字节点上运行多个线程,那么您可以拥有内存分配在另一个套接字上的核心访问的一个套接字上,这很慢。

所以在这些情况下人们可以做的是:

  • 每个套接字一个进程(而不是每个节点,因为 NUMA)
  • 将线程固定到内核,将内存固定到套接字
  • 在套接字上,使用 TBB
  • 在一个套接字之外,使用 MPI。

我并不是说“经常”,因为许多科学代码仍然只是 MPI,并且可能难以引入线程,由于内存共享,这是一种完全不同的方法。

【讨论】:

  • 为什么 TBB 优于 OpenMP?
  • TBB 更适合 C++,OpenMP 有一个糟糕的任务模型(甚至委员会的人都这么说),你可以使用 TBB 或其他 C++ 库从更高级别做事.
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 2012-11-27
  • 2014-08-06
  • 2010-10-31
  • 2015-12-12
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多