OpenMP和共享存储器的定义

问题描述:

按照OpenMP web site OpenMP是“并行编程的事实上的标准上的共享存储器系统”根据Wikipedia使用用于通信存储器中的单个程序内部,例如其在多个线程之间,通常不称为共享内存OpenMP和共享存储器的定义

这里有什么问题?这是“一般”的术语吗? OpenMp真的只是通过一个相同的虚拟地址空间创建线程“共享内存”,不是吗?另外,我猜OpenMP能够在NUMA体系结构上运行,其中所有处理器都可以访问所有内存,但当共享数据的线程分配给访问不同内存的内核时,会增加内存访问时间访问时间。这是真的 ?

我正在编纂一个全面的答案,试图回答作为对lucas1024答案的评论问题。

在“共享内存”

在一只手的意思,你有面向软件的(即面向OS-)共享存储的含义:一种方法,使不同的进程访问同样的内存块(即放宽通常的操作系统约束,即给定的进程不应该能够篡改其他进程的内存)。正如*页面所述,POSIX共享内存API是这种工具的一个实现。在这种接受中,讲线程没有什么意义(一个操作系统甚至不提供线程就可以提供共享内存)。另一方面,您具有“共享内存”的硬件导向意义:硬件配置,其中所有CPU都可访问同一块RAM。

在“线程”

的意义现在,我们必须消除歧义的另一种说法:“线程”。操作系统可能提供一种在进程中拥有多个并发执行流的方法。 POSIX线程是这种功能的实现。

然而,OpenMP规范都有自己的定义:

螺纹:用栈和相关的静态存储器的执行实体,称为 线程专用内存。

OpenMP线程:由OpenMP运行时系统管理的线程。

这样的定义很好地符合例如POSIX线程和大多数OpenMP实现确实使用POSIX线程来创建OpenMP线程。但是您可能会想到在不提供POSIX线程或等效功能的操作系统之上的OpenMP实现。这样的OpenMP实现将不得不在内部管理执行流程,这很难但完全可行。或者,他们可能会将OpenMP线程映射到操作系统进程,并使用某种“共享内存”功能(在操作系统的意义上)来使它们共享内存(尽管我不知道任何OpenMP实现会这样做)。

最终,您对OpenMP实现的唯一限制是所有的CPU都应该有一种方法来共享对同一个*内存的访问。也就是说,OpenMP程序应该在硬件意义上的“共享内存”系统上运行。但是,OpenMP线程不一定必须是相同OS进程的POSIX线程。

“共享内存系统”只是一个系统,其中多个内核或CPU通过本地总线访问单个内存池。所以OpenMP网站是正确的。 程序中的线程之间的通信不是通过使用“共享内存”来完成的 - 而是通常指通过内存在同一台机器上的进程之间进行通信。因此,*条目并不矛盾,事实上,它指出了硬件和软件术语的差异。

+0

感谢您的回答。但我仍然没有真正明白OpenMP和共享内存系统之间的联系(我猜OpenMP网站在这里指的是硬件共享内存)。正如你所说的,程序中的线程之间的通信不是使用“共享内存”来完成的,因为OpenMP只是隐藏了程序员的线程,这听起来很奇怪吗? – 2012-03-29 07:05:11

+0

@ManuelSelva OpenMP指定了这一点,因为它只能在共享内存系统上使用(与其他并行化工具集如MPI支持的分布式内存系统相反)。对于潜在的未来用户来说,了解这一点非常重要,因为它会限制他们在群集上运行代码的能力。由于OpenMP隐藏了实际的实现细节,因此它不会告诉您线程通信的方式。 – Francesco 2012-03-29 07:10:51

+0

@Francesco,我同意OpenMP不能用于群集。但其原因与共享内存和分布式内存无关,而仅仅是因为OpenMP是线程的抽象,并且线程仅限于周围的进程边界。因此OPenMP只能在GIVEN PROCESS中使用,是真的吗? – 2012-03-29 08:19:50