GPU這麼厲害,我們為什麼還要用CPU?

作者 | TEDDY WAHLE
譯者 | 王強
策劃 | 褚杏娟
最近,Twitter 上出現了一段 2009 年的老影片。它讓觀眾可以直觀地瞭解 CPU 和 GPU 之間的區別。
原始影片在此,時長 90 秒:https://youtu.be/-P28LKWTzrI
在這個影片中,CPU 和 GPU 兩種處理器在一場繪畫對決中正面交鋒。兩種處理器先後連線到了一臺發射彩彈來作畫的機器上,透過射擊到螢幕上的彩蛋來繪製圖像。
CPU 需要整整 30 秒才能畫出一個非常基本的笑臉:
然後 GPU 瞬間就能畫出一幅蒙娜麗莎的影像:
單純從這段影片中可以得出一個結論:CPU 速度很慢,GPU 速度很快。雖然這是事實,但影片中並沒有提到兩種處理器的很多細微差別。
每秒萬億次浮點運算(TFLOPS)
當我們說 GPU 的效能比 CPU 高得多時,我們指的是一種稱為 TFLOPS 的測量方法,它本質上是衡量處理器在一秒鐘內可以執行多少萬億次數學運算。例如,Nvidia A100 GPU 可以執行 9.7 TFLOPS(每秒 9.7 萬億次浮點操作),而最新一代的 Intel 24 核處理器可以執行 0.33 TFLOPS。這意味著中等水平的 GPU 至少比最強大的 CPU 快 30 倍。
但我的 MacBook(蘋果 M3 晶片)中的晶片同時包含了一個 CPU 和一個 GPU。為什麼?我們不能放棄這些非常慢的 CPU 嗎?
不同型別的程式
讓我們定義兩種型別的程式:順序程式和並行程式。
順序程式
順序程式指的是所有指令都必須一個接一個執行的程式。以下是一個例子。
defsequential_calculation(): a = 0 b = 1for _ in range(100): a, b = b, a + breturn b
在這裡,我們連續 100 次使用前兩個數字來計算下一個數字。這個程式的一個重要特徵是每個步驟都依賴於它之前的兩個步驟。如果你手動做這個計算的話,你不能告訴朋友,“你計算第 51 步到第 100 步,而我從第 1 步開始”,因為他們需要第 49 步和第 50 步的結果才能開始計算第 51 步。每個步驟都需要知道序列中的前兩個數字。
並行程式
並行程式是可以同時執行多個指令的程式,因為它們不依賴於彼此的結果。以下是一個例子:
defparallel_multiply(): numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] results = []for n in numbers: results.append(n * 2)return results
在這個例子中,我們進行了 10 次完全獨立的乘法運算。這裡重要的是順序無關緊要。如果你想和朋友分擔工作,你可以說:“你乘奇數,我乘偶數。”你們可以分開工作,也可以同時工作,並得到準確的結果。
錯誤的二分法
實際上,這種劃分是一種錯誤的二分法。大多數大型真實應用程式都混合了順序和並行程式碼。事實上,每個程式都會有一定比例的指令是可並行化的。
例如,假設我們有一個執行 20 次計算的程式。前 10 個是斐波那契數,必須按順序計算,但後 10 個計算可以並行執行。我們會說這個程式是“50% 可並行化的”,因為一半的指令可以獨立完成。為了說明這一點:
defhalf_parallelizeable():# Part 1: Sequential Fibonacci calculation a, b = 0, 1 fibonacci_list = [a, b]for _ in range(8): # Calculate 8 more numbers a, b = b, a + b fibonacci_list.append(b)# Part 2: Each step is independent parallel_results = []for n in fibonacci_list: parallel_results.append(n * 2)return fibonacci_list, parallel_results
前半部分必須是連續的——每個斐波那契數都取決於它前面的兩個數。但後半部分可以採用完整的列表並獨立地將每個數字加倍。
如果不先計算第 6 和第 7 個數,你就無法計算第 8 個斐波那契數,但一旦有了完整的序列,你就可以將加倍操作分配給儘可能多的可用工作器。
不同程式型別適合不同的處理器
廣義上講,CPU 更適合順序程式,而 GPU 更適合並行程式。這是因為 CPU 和 GPU 之間存在根本的設計差異。
CPU 具有少量較大的核心(蘋果 M3 具有 8 核 CPU),而 GPU 有許多小的核心(Nvidia 的 H100 GPU 有數千個核心)。
這就是 GPU 擅長執行高度並行的程式的原因——它們有數千個簡單核心,可以同時對不同的資料執行相同的操作。
渲染影片遊戲圖形是一種需要進行許多簡單重複計算的應用程式。想象一下你的影片遊戲螢幕是一個巨大的畫素矩陣。當你突然將角色向右轉動時,所有這些畫素都需要重新計算為新的顏色值。所幸螢幕頂部畫素的計算與螢幕底部畫素的計算是獨立的。因此,計算可以分散到數千個 GPU 核心上。這就是 GPU 對遊戲如此重要的原因所在。
CPU 擅長處理隨機事件
在高度並行的任務(例如將 10,000 個獨立數字的矩陣相乘)方面,CPU 比 GPU 慢得多。但是,它們擅長複雜的順序處理和複雜的決策。
將 CPU 核心想象成繁忙餐廳廚房裡的主廚。這位廚師可以:
  • 當有特殊飲食要求的 VIP 客人到來時,立即調整烹飪計劃
  • 在準備精緻醬汁和檢查烤蔬菜之間無縫切換
  • 透過重新組織整個廚房工作流程來處理停電等意外情況
  • 安排多道菜的烹飪過程,讓它們在恰當的時刻熱騰騰地送到
  • 在處理數十個完成狀態各異的訂單同時保持食物質量
相比之下,GPU 核心就像一百名擅長重複任務的流水線廚師——他們可以在兩秒鐘內切好洋蔥,但無法有效地管理整個廚房。如果你要求 GPU 處理不斷變化的晚餐服務需求,它會很吃力。
這就是為什麼 CPU 對於執行計算機作業系統至關重要的原因所在。現代計算機面臨著一系列不可預測的事件:應用程式啟動和停止、網路連線斷開、檔案被訪問以及使用者在螢幕上隨機點選。CPU 擅長處理所有這些任務,同時保持系統響應能力。它可以立即從幫助 Chrome 渲染網頁切換到處理 Zoom 視訊通話,再到處理新的 USB 裝置連線——同時跟蹤系統資源並確保每個應用程式都得到應有的關注。
因此,雖然 GPU 擅長並行處理,但 CPU 仍然因其處理複雜邏輯和適應不斷變化的條件的獨特能力而保持著不可或缺的地位。像蘋果 M3 這樣的現代晶片兼具兩者:將 CPU 靈活性與 GPU 計算能力相結合在一起。
事實上,能夠更準確反映實際情況的繪畫工作對比影片會顯示出 CPU 管理影像的下載和記憶體分配工作,然後再排程 GPU 快速渲染畫素。
原文連結:
https://codingstuff.substack.com/p/if-gpus-are-so-good-why-do-we-still
會議推薦
在 AI 大模型技術如洶湧浪潮席捲軟體開發領域的當下,變革與機遇交織,挑戰與突破共生。2025 年 4 月 10 – 12 日,QCon 全球軟體開發大會將在北京召開,以 “智慧融合,引領未來” 為年度主題,匯聚各領域的技術先行者以及創新實踐者,為行業發展撥雲見日。現在報名可以享受 8 折優惠,單張門票立省 1360 元,詳情可聯絡票務經理 18514549229 諮詢。
你也「在看」嗎?👇

相關文章