多核心、一致性與執行緒層級平行

共享記憶體多處理器(shared-memory multiprocessor)

想像好幾個人在一間辦公室裡,圍著一塊共用的白板工作。任何人都能讀它、任何人都能寫它,而且大家看到的是同一塊白板。要傳訊息你不必走過去把紙條交給人——你只要寫在白板上,同事就會讀到。共享記憶體多處理器(shared-memory multiprocessor)就建立在這個想法上:許多核心全都看到一個共同的記憶體池,用同一套位址,並透過讀寫相同的記憶體位置來合作。

具體地說,每個核心都能對共享實體記憶體裡的任何位址發出載入或儲存,而位址 0x4000 對它們全部指的是同一個位元組。當核心 A 想告訴核心 B 一件事,A 就把一個值寫到約定好的位址,B 再把它讀回——溝通隱含在普通的記憶體操作裡,沒有明確的送出或接收。這是單一多核心晶片內部、以及一台伺服器各插槽之間的主流模型,也是大多數多執行緒程式所假設的。

這份方便藏著兩個難題,正是這個領域接下來要談的。第一,每個核心都保有共享資料的私有快取副本,所以當一個核心寫入時,其他核心可能還握著過時的副本——那就是快取一致性(cache coherence)問題。第二,當好幾個核心讀寫相同位置時,誰在何時看到什麼的確切交錯必須釘死——那就是記憶體一致性模型(memory consistency model)。共享記憶體容易想像,也容易犯下細微的錯;讓它既正確又快,正是多核心的核心工程。

兩個核心共享位址 X 上的一個計數器。核心 A 做:載入 X、加 1、儲存 X。核心 B 也做同樣的事。如果兩者在任一方儲存前都先載入舊值 5,兩者都算出 6 並儲存 6——一次遞增被丟失了。共享記憶體讓溝通變得不費力,卻暴露了一個需要原子操作或鎖來修正的競爭。

共享記憶體讓核心毫不費力地對話,但不設防的並行更新會競爭——這是共享位址空間模型的代價。

共享記憶體與訊息傳遞(message passing)相對,後者中核心各有獨立記憶體,必須明確地送出與接收。共享記憶體在小規模時較好寫,但較難擴展到數千個節點。

又称
shared-address-space multiprocessor共享位址空間多處理器