為什麼 CPU 不能直接對內存中的數據進行運算?

我就不問是不是了,有能直接對內存中的數據進行運算的 CPU 再改問題。求說得盡量通俗一些。


CPU中實際負責運算的部分叫ALU。而ALU的底層直接就是各種門電路了,用以運算的輸入也是直接來自寄存器。寄存器的實現可以用觸發器。但一個CPU往往有多個寄存器。有些CPU的ALU會限制運算的輸入輸出來自特定的寄存器,也有些可以指定運算所用的寄存器。以後者為例,當指令指明要用哪個寄存器時,底層的實現是用多輸入與門來做的選址。所以,如果指令允許使用的寄存器有16個(AVR單片機),那麼每個bit的線上就需要一個17輸入與門,以及一個選擇寄存器的解碼器。32bit系統就需要32個17輸入與門,常見的二操作數指令,就是再乘二。這在CPU里所帶來的複雜性是很麻煩的。所以,要限制寄存器數量。

正因為如此,早期的x86指令集,允許直接進ALU的寄存器是很少的,記得是4個。ARM等RISC指令集對此做了擴充,使得更多寄存器可以進入ALU參與運算,但同時也會帶來電路設計上的複雜度。

如上是以ALU定址的角度來解釋的。另一方面,就是對大多數CPU內存比寄存器要慢。有些計算的變數不多時,可以直接在寄存器里完成許多工作。編譯器也會優化函數對寄存器的使用,使得變數儘可能都在寄存器里。一旦所需數據不在寄存器,而在內存里,就要佔用匯流排資源來載入數據到寄存器,這個操作在一些CPU里可能要十幾個甚至幾十個時鐘周期。這就會讓程序的執行變的很慢。


我覺得首先要明確一下直接對內存數據進行計算是指什麼。

1.如果是說有沒有一條指令可以完成讀內存 計算 再把結果寫回內存 那顯然是有的。x86的運算指令就可以用內存數據當運算對象

2. 如果是更lower level一點 對於微指令 絕大部分情況下是沒有直接在內存數據上計算的. 通常應該是用load把內存數據都到register 然後在register上進行運算。對於risc來說, 這些每一個操作其實大都是一條彙編指令

3. 一些特殊情況 比如一些+1的運算 為了加快速度 是有設計直接把運算執行在 緩存上的 而不需要讀出數據用運算單元去計算


馬雲直接管員工不?管,阿里巴巴剛成立時十號人,馬雲哪個都要管; 公司規劃再擴大些呢?就設經理層了,馬雲直接管經理們就行了; 再擴大些呢,就設總監、VP甚至集團總裁了,馬雲管這些人就行了。而當初追隨他的十大金剛呢?有的成了集團總裁,仍然直接給他彙報; 有的位置在下面點,當個中層和底層; 還有的已經離開了。

內存與CPU的關係就相當於由當初的創業團隊員工變成了個中層,不直接向馬雲(CPU)彙報,上面還有幾級(cache),但是比起其它設備來說地位高多了; 有的設備還勉強算個中層(如硬碟),有的還在底層(如鍵盤),還有的已經被淘汰啦(如軟盤)。


通俗一點是么?

這麼說吧,內存這東西其實並非是一定需要的。畢竟根本上數據是存放在外存(硬碟、光碟)上的。所以歸根結底,我們是需要對硬碟上的數據進行運算。

那麼舉個例子來說明一下CPU要對硬碟上兩個數據的運算:你現在在新疆的大草原上的科研站裡面,我需要你把北京國家圖書館編號12345的書裡面第2頁第2行裡面的數字和編號7890的書裡面第59頁第30行的數字相加,然後寫到編號2468的書裡面第52頁紙上。

當然,你直接坐飛機去北京,到國家圖書館裡面去翻這幾本書出來找到這兩個具體是什麼數字,算完了寫回去是一個辦法——這就是CPU直接對硬碟上的數據進行計算。

然而下一個計算任務,是巴黎的圖書館裡面的兩本書——這是來自於網路的兩個數據。而且你還沒有護照,想飛去巴黎都不行。

所以我們還是把這些書運到烏魯木齊的機場好了,你算好了再運回去——烏魯木齊機場的倉庫就是內存。

想在烏魯木齊的機場算數么?也不是不行,可是有很多複雜的運算,你口算不出來的,你需要使用科研站的設備幫助你計算。你當然可以算一題回去科研站一趟,然後又去機場取下一道題。但還是很費勁不是?於是你把書都運輸到科研站的書架上——書架就是一級緩存。當然,之前需要先運到科研站的收發室——收發室就是二級緩存。真到了你需要計算的時候,你從書架上把書取下來,攤開在桌子上——你的桌子就是寄存器。算完一題,把結果寫好然後填好快遞單放回書架,再拿下一題要用的書。


你還是先問有沒有吧...

答案是有...

比如你把一個數據放到uncacheable的地方,然後執行add eax,[mem]

就跳過了緩存


https://www.eecis.udel.edu/~lxu/resources/TOP-PIM:%20Throughput-Oriented%20Programmable%20Processing%20in%20Memory.pdf

說點有的沒的東西吧。 AMD Research在12年發過一個TOP-PIM的東西,講的就是Processing in Memory。雖然最後還是在CU中處理,不過已經接近樓主的想法了。

存取導向的代碼將會在這些內存中的處理器中執行來利用堆疊內存所帶來的高帶寬和低功耗。由於這些內存內處理器被用來運行存取導向的代碼,他們的計算資源可以被有化成面向低功耗低發熱的設計。同時主運算處理器(Host),並沒有內存堆疊在上面,就不必嚴格服從發熱限制,也就可以為計算導向代碼提供高性能表現,這個研究的首要目的是確定這種輔助的內存中處理器在寬領域應用中的性能和能耗特性。

簡單說就是APU的GPU上堆疊HBM,然後GPU去跑帶寬導向的操作……

Dong Ping Zhang博士那還有很多In Memory計算的文章可以看。不過AMD啥時候能HSA玩轉就是問題了……

? Publications Dong Ping Zhang


前幾天我也有這個問題,後來看明白微機原理之後就解決了,你說的動作叫做「運算」對吧,最簡單的運算,邏輯與或非,或者加減法,比如你內存裡面0000存了1,0001存了1你想讓他們相加,那麼,就得有相應的加法電路,

比如一個1位全加器的硬體描述是:

結果位c=a異或b,

進位位d=a與b,

工作原理如下:當a或者b為1時,異或結果為1(一加零和零加一都是一對吧),當同時為1時,結果為0,進位1,也就是二進位10(一加一等於二,數字電路二進位電路就要進位10就是十進位的二),當ab同時為0,結果是00「總之就是數電那套邏輯」

而這套邏輯是由具體硬體實現的,晶元上有專門的與或非門組合來實現這些邏輯,並且通過連線把數據引過來,運算單元就是一個黑盒子,有入口有出口,你說的內存,指的是memory,一般都不小,現在筆記本隨便就4個g8個g吧?,要內存中每一個單元「都」可以直接連接這個黑盒子,那假設一個單元一根線,2g內存要多少根線呢?不現實對不對?

所以,內存中的數據,不可以直接和這個處理模塊通信,那怎麼辦呢,我們借用中間的register,以arm為例,這樣的通用register有16個左右「R0-R15」這些寄存器數量不多,但是可以直接和運算單元連接,需要計算的時候,先從內存中把數據讀進來,交給reg,reg通過內部數據線把數據送去運算,若干時鐘周期過後,算好了,把數據吐回reg (對還是reg不是mem,出入都只能是reg),然後reg再把數據送回memory

不知道你有沒有看過彙編語言,跟c語言不一樣,高級語言我們寫c=a+b好像可以直接相加,而彙編是r1=a,r2=b,r1=r1+r2,c=r1「其實這裡寫法不嚴謹,彙編裡面,不是用等於傳遞數值,用mov,加法也不是加號,是add」


圖侵刪

如果cpu一個cycle是1秒

來源見水印


速度不匹配


processing in memory。


因為太慢


請學習微機原理一課


你為什麼不直接端著電飯鍋吃飯?


你的意思是為什麼要先轉移到寄存器再做算嗎?如果是的話,這麼說吧,做算可能需要多個操作數,匯流排就只有一條,所以當然是從內存中通過匯流排取操作數到各個寄存器再運算啊,其次就是寄存器的速度更快


因為太慢了,從內存中讀取數據本身就需要多個時鐘周期


公務員為什麼不上門服務……


內存的存取速度太慢了,跟不上cpu的運算速度


最近正好看了相關論文,試答。

近幾十年memory的訪問速度提升遠遠落後於CPU的頻率提高,有種開飛機和吉普賽跑的感覺。每次CPU對虛地址內容的訪問都會在main memory上等待很長時間(幾百clock cycle?),在這樣的背景下緩存出現了,發展到今天緩存結構已經出現了L1,L2,L3這樣的三級cache,因為page table是貯存在main memory中的,這也出現了一個特別的緩存,TLB,下面我稍微詳細說說這四個cache。

1.L1 他是離CPU最近的cache,訪問速度差不多一個cycle,實際上每個CPU core都擁有一個L1 cache,普遍是256KB,又分為data cache和instruction cache,主要是為了適應現代計算機的流水線技術。

2.L2 和L1類似,但L2的個頭更大,我的是1M,它不分data和instruction,訪問速度也相應的變慢了。

3. L3 有的CPU中可能會沒有這級cache,個頭最大,我的達到了6M,同樣訪問速度也相應變慢,他是core之間共享使用的。

4. TLB 和上面的cache類似,它分為多級,L1 TLB分為data和instruction TLB。page entriesdata TLB會多點不同CPU都有差別。L2 TLB是shared,page entries可以達到1024個。

所有的緩存都有inclusive和exclusive之分,TLB又有地址映射方式之分。

才疏學淺,疏漏之處還望指正


內存的存取速度慢吧


推薦閱讀:

有無必要買台高端電腦,只為幾年不換?
預算8000上下,自己攢機?
手機CPU能用在PC上嗎?
電腦cpu太差是什麼體驗?

TAG:中央處理器CPU | 現場可編輯邏輯門陣列FPGA | 數字電路 | 計算機體系架構 | 數字IC設計 |