根据OpenMP web site OpenMp是“共享内存系统并行编程的事实标准”根据Wikipedia“使用内存进行内部通信单个程序,例如在其多个线程中,通常不称为共享内存。“
这里有什么问题?这是“一般”的术语吗? OpenMp实际上只是通过一个相同的虚拟地址空间创建“共享内存”的线程,不是吗?
此外,我想OpenMP能够在NUMA架构上运行,其中所有处理器都可以处理所有内存,但是当线程共享数据时,内存访问时间增加,分配给访问不同访问权限的不同内存的内核时间。这是真的吗?
答案 0 :(得分:3)
我正在编写一个完整的答案,试图回答有关lucas1024答案的进一步问题。
关于“共享记忆”的含义
一方面,您拥有共享内存的面向软件(即面向操作系统)的含义:一种使不同进程能够访问同一块内存的方法(即放宽给定内存的通常操作系统约束)进程不应该能够篡改其他进程的内存)。如维基百科页面中所述,POSIX共享内存API是此类工具的一种实现。在这个接受中,谈论线程没有多大意义(操作系统可能提供共享内存而不提供线程)。
另一方面,您具有“共享内存”的硬件定义:硬件配置,其中所有CPU都可以访问同一块RAM。
关于“线程”的含义
现在我们必须消除另一个术语的歧义:“线程”。操作系统可能提供一种在进程内具有多个并发执行流的方法。 POSIX线程是这种功能的实现。
但是,OpenMP规范有自己的定义:
thread:具有堆栈和关联静态内存的执行实体,称为 threadprivate memory。
OpenMP线程:由OpenMP运行时系统管理的线程。
这些定义与例如POSIX线程和大多数OpenMP实现确实使用POSIX线程来创建OpenMP线程。但您可能会想象在OS提供POSIX之上的OpenMP实现,它们不提供POSIX线程或等效功能。这样的OpenMP实现必须在内部管理执行流程,这很困难但完全可行。或者,他们可能将OpenMP线程映射到OS进程并使用某种“共享内存”功能(在OS意义上)来使它们共享内存(尽管我不知道任何OpenMP实现这样做)。
最后,您对OpenMP实现的唯一约束是所有CPU都应该有一种共享对同一中央内存的访问权限的方法。也就是说,OpenMP程序应该在硬件意义上的“共享内存”系统上运行。但是,OpenMP线程不一定必须是同一OS进程的POSIX线程。
答案 1 :(得分:2)
“共享内存系统”只是一个系统,其中多个内核或CPU通过本地总线访问单个内存池。所以OpenMP网站是正确的。 程序中的线程之间的通信不是使用“共享内存”完成的 - 相反,该术语通常是指通过内存在同一台机器上的进程之间进行通信。因此,维基百科条目并不矛盾,事实上,它指出了硬件和软件之间术语的差异。