Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenMp和共享内存定义_C_Parallel Processing_Openmp - Fatal编程技术网

C OpenMp和共享内存定义

C OpenMp和共享内存定义,c,parallel-processing,openmp,C,Parallel Processing,Openmp,根据OpenMp,“共享内存系统上并行编程的事实标准”,根据“在单个程序内(例如在其多个线程之间)使用内存进行通信通常不称为共享内存” 这里怎么了?这是“一般”术语吗? OpenMp实际上只是通过一个相同的虚拟地址空间创建线程“共享内存”,不是吗 此外,我猜OpenMP能够在NUMA架构上运行,在NUMA架构中,所有的内存都可以由所有处理器寻址,但当共享数据的线程被分配给在不同访问时间访问不同内存的内核时,内存访问时间会有所增加。这是真的吗?一个“共享内存系统”就是多个内核或CPU通过本地总线访

根据OpenMp,“共享内存系统上并行编程的事实标准”,根据“在单个程序内(例如在其多个线程之间)使用内存进行通信通常不称为共享内存”

这里怎么了?这是“一般”术语吗? OpenMp实际上只是通过一个相同的虚拟地址空间创建线程“共享内存”,不是吗

此外,我猜OpenMP能够在NUMA架构上运行,在NUMA架构中,所有的内存都可以由所有处理器寻址,但当共享数据的线程被分配给在不同访问时间访问不同内存的内核时,内存访问时间会有所增加。这是真的吗?

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

我在这里编辑了一个完整的答案,试图回答作为对lucas1024答案的评论而提出的进一步问题

关于“共享内存”的含义

一方面,共享内存具有面向软件(即面向操作系统)的含义:允许不同进程访问同一内存块的方法(即放宽通常的操作系统限制,即给定进程不应篡改其他进程的内存)。正如wikipedia页面中所述,POSIX共享内存API就是这种功能的一种实现。在这种情况下,谈论线程没有多大意义(操作系统可能提供共享内存,甚至不提供线程)

另一方面,您具有“共享内存”的面向硬件的含义:所有CPU都可以访问同一块RAM的硬件配置

关于“线程”的含义

现在我们必须消除另一个术语“线程”的歧义。操作系统可以提供一种在一个进程中拥有多个并发执行流的方法。POSIX线程就是这样一个特性的实现

但是,OpenMP规范有自己的定义:

线程:具有堆栈和关联静态内存的执行实体,称为 线程专用内存

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

这些定义与POSIX线程的定义非常吻合,大多数OpenMP实现确实使用POSIX线程来创建OpenMP线程。但您可能会想象OpenMP在操作系统之上的实现,这些操作系统不提供POSIX线程或等效功能。这样的OpenMP实现必须在内部管理执行流,这已经足够困难,但完全可行。或者,他们可能会将OpenMP线程映射到操作系统进程,并使用某种“共享内存”功能(在操作系统意义上)使其能够共享内存(尽管我不知道有任何OpenMP实现会这样做)


最后,OpenMP实现的唯一限制是,所有CPU都应该能够共享对同一中央内存的访问。也就是说,OpenMP程序应该在硬件意义上的“共享内存”系统上运行。但是,OpenMP线程不一定必须是同一操作系统进程的POSIX线程。

谢谢您的回答。但我仍然没有真正理解OpenMP和共享内存系统之间的联系(我猜OpenMP网站在这里指的是硬件共享内存)。正如您所说,程序中线程之间的通信不是使用“共享内存”完成的,而且OpenMP只是向程序员隐藏线程,这听起来很奇怪?@ManuelSelva OpenMP指定了这一点,因为它只能在共享内存系统上使用(与分布式内存系统相反,分布式内存系统由其他并行化工具集(如MPI)支持)。对于未来的潜在用户来说,了解这一点非常重要,因为这将限制他们在群集上运行代码的能力。例如,由于OpenMP隐藏了实际的实现细节,因此它不会告诉您线程通信的方式。@Francesco,我同意OpenMP不能在群集上使用。但原因与此无关共享内存与分布式内存,但仅仅是因为OpenMP是线程的抽象,而且线程仅限于周围的进程边界。因此OpenMP只能在给定的进程内使用,是吗?@ManuelSelva这太长了,无法放入注释。请看我的回答。