前沿與後摩爾時代

記憶體內運算(processing-in-memory)

在一般電腦裡,處理器和記憶體住在不同的建築,每一筆資料都得通勤。要把一百萬個數字加起來,處理器送一個請求給記憶體,那些數字一批一批沿著長長的路搭車回來,處理器把它們相加,而大部分的時間與能量花在這趟旅程上,而不是花在相加上。這就是資料搬移之牆:對許多現代工作負載來說,把資料取來的成本遠高於對它運算。記憶體內運算問了一個激進的問題——如果我們把至少一部分運算搬進記憶體本身來做,讓資料幾乎不必移動,會怎樣?

具體而言,記憶體內運算(PIM)把簡單的運算能力放在資料儲存的地方——記憶體晶片內部或緊鄰它——而不是把每個位元組越過匯流排運到遙遠的處理器。一個 PIM 設計可能在每個 DRAM 記憶庫旁邊放小小的算術單元,於是像「把這兩個大陣列相加」或「找出最大值」這樣的操作就在本地發生,只有小小的最終結果旅行回來。因為記憶庫很多,這許多小引擎能並行工作,而關鍵在於資料從不必跑那趟昂貴的來回。某些實驗形態甚至利用記憶體陣列本身的物理特性,一步就完成像「把整欄儲存值加總」這樣的操作。

為什麼這很重要?因為對機器學習、搜尋與分析這類渴求資料的工作負載而言,搬移資料主宰了能量預算——從遙遠的記憶體讀一個數字,可能比對它做的算術耗上多好幾個數量級的能量。PIM 直接攻擊那道牆。誠實的提醒是實在的:記憶體晶片是為了密集又便宜而製造的,不是為了承載快速邏輯,所以你能塞進記憶體的運算有限、也不總是快;為 PIM 寫程式很陌生,軟體堆疊也不成熟;而且它最有幫助的是對巨量資料做簡單、規律的操作,不是複雜、多分支的程式碼。PIM 是針對資料搬移問題、仍在成熟中的有希望答案,不是處理器的即插即用替代品。

要計算兩個各裝十億個數字的陣列的逐元素和,一般 CPU 必須把全部二十億個數字越過記憶體匯流排讀進來、相加,再把十億個結果寫回去——大部分都是匯流排流量。一個 PIM 設計把加法器放在 DRAM 記憶庫旁邊:加法在記憶體裡發生,只有結果陣列(甚至只是一個摘要)離開晶片,大幅削減了必須旅行的資料量。

在資料已經所在之處做運算,避開了越過記憶體匯流排那趟昂貴的來回。

PIM 不是通用處理器的替代品。記憶體是為了密集又便宜而打造的,不是為了跑快速邏輯,所以 PIM 主要對巨量資料的簡單、規律操作有幫助;它的程式設計模型尚不成熟,複雜的多分支程式碼也不適合。

又稱
PIMin-memory computingcompute-in-memory記憶體內運算記憶體內計算