我正在編纂一個全面的答案,試圖回答作爲對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線程。
感謝您的回答。但我仍然沒有真正明白OpenMP和共享內存系統之間的聯繫(我猜OpenMP網站在這裏指的是硬件共享內存)。正如你所說的,程序中的線程之間的通信不是使用「共享內存」來完成的,因爲OpenMP只是隱藏了程序員的線程,這聽起來很奇怪嗎? – 2012-03-29 07:05:11
@ManuelSelva OpenMP指定了這一點,因爲它只能在共享內存系統上使用(與其他並行化工具集如MPI支持的分佈式內存系統相反)。對於潛在的未來用戶來說,瞭解這一點非常重要,因爲它會限制他們在羣集上運行代碼的能力。由於OpenMP隱藏了實際的實現細節,因此它不會告訴您線程通信的方式。 – Francesco 2012-03-29 07:10:51
@Francesco,我同意OpenMP不能用於羣集。但其原因與共享內存和分佈式內存無關,而僅僅是因爲OpenMP是線程的抽象,並且線程僅限於周圍的進程邊界。因此OPenMP只能在GIVEN PROCESS中使用,是真的嗎? – 2012-03-29 08:19:50