Chapter 4 of 9Chương 4/9 7 min7 phút
CPU vs GPUCPU và GPU khác nhau ở đâu
A processor is planned the way an architect plans a house: first what it is for, then how many rooms it needs, and above all how people will move between them. The two best-known rooms on today’s chips, the CPU and the GPU, were designed for opposite jobs.
Thiết kế một bộ xử lý cũng giống như kiến trúc sư lên phương án cho một ngôi nhà: trước hết xác định nhà dùng để làm gì, rồi cần bao nhiêu phòng, và quan trọng nhất là đường đi lại giữa các phòng. Hai “căn phòng” nổi tiếng nhất trên chip ngày nay, CPU (Central Processing Unit) và GPU (Graphics Processing Unit), được thiết kế cho hai công việc trái ngược nhau.
In this chapter
Trong chương này
- What a chip architect does, and why every unit is designed with its neighbours in mind
- How a new chip starts as a high-level design before any unit is drawn in detail
- The parts of a CPU: arithmetic units, control logic, branch prediction and a deep memory system
- How a GPU trades that complexity for thousands of small, simple cores
- Why one is called latency-oriented and the other throughput-oriented
- Chip architect làm gì, và vì sao mỗi khối đều phải được thiết kế trong tương quan với các khối bên cạnh
- Một con chip mới bắt đầu từ bản thiết kế tổng thể (high-level design) như thế nào, trước khi đi vào chi tiết từng khối
- Các thành phần của CPU: ALU (Arithmetic Logic Unit), khối điều khiển, branch prediction (dự đoán rẽ nhánh) và memory hierarchy (hệ thống bộ nhớ nhiều tầng)
- GPU đánh đổi sự phức tạp đó để có hàng nghìn lõi (core) nhỏ và đơn giản ra sao
- Vì sao một bên được gọi là thiết kế hướng latency (độ trễ), còn bên kia hướng throughput (thông lượng)
Designing a chip is like designing a house
Thiết kế chip như thiết kế một ngôi nhà
Most people have a rough idea of what a chip designer does, and almost nobody knows what a chip architect does. The job is easiest to understand through the word itself. Computer architecture is to a chip what architecture is to a building: before anyone lays a brick, someone has to decide what the building is for, how large it will be, how many rooms it needs and what each room does.
Nhiều người hình dung được đại khái công việc của một kỹ sư thiết kế chip, nhưng gần như chẳng ai biết một chip architect làm gì. Cách dễ hiểu nhất là đi từ chính chữ “kiến trúc”. Kiến trúc máy tính (computer architecture) đối với con chip cũng giống như kiến trúc đối với tòa nhà. Trước khi đặt viên gạch đầu tiên, phải có người quyết định tòa nhà dùng để làm gì, rộng bao nhiêu, cần mấy phòng và mỗi phòng có công năng gì.
Then comes the part that separates a good house from a bad one: the paths between the rooms. A kitchen far from the dining room works, but everyone pays for it every day. On a chip the rooms are the processing units and the paths are the wiring and links that carry data between them, and they matter just as much.
Rồi đến phần phân biệt một ngôi nhà tốt với một ngôi nhà dở: lối đi giữa các phòng. Bếp nằm xa phòng ăn thì vẫn dùng được, nhưng ngày nào cả nhà cũng phải trả giá cho sự bất tiện ấy. Trên con chip, các căn phòng là những khối xử lý, còn lối đi là hệ dây dẫn và đường kết nối chuyển dữ liệu qua lại giữa chúng, và lối đi quan trọng không kém gì căn phòng.
The processor in a phone or a laptop is often a System on Chip (SoC): one piece of silicon that holds a central processing unit (CPU), a graphics processing unit (GPU), the system that feeds them with memory, and the links that connect them all. An architect’s team decides how those parts are arranged and how they talk to each other.
Bộ xử lý trong điện thoại hay máy tính xách tay thường là một System on Chip (SoC): trên cùng một miếng silicon có CPU, GPU, hệ thống bộ nhớ cấp dữ liệu cho chúng và các đường kết nối tất cả lại với nhau. Nhóm kiến trúc sư quyết định các bộ phận ấy được sắp đặt ra sao và trao đổi với nhau thế nào.
Each architect owns one unit but must understand the whole system
Kiến trúc sư phụ trách một khối nhưng phải hiểu cả hệ thống
No single architect designs a whole modern chip. In daily work each one is responsible for a particular unit: the CPU, say, or the memory system, or the links between chips. But the field expects each of them to understand the system around that unit, and the reason is practical. A feature added to one unit almost always changes what its neighbours have to do, so architects spend much of their time talking to the people who own the units next door.
Không kiến trúc sư nào một mình thiết kế trọn một con chip hiện đại. Trong công việc hằng ngày, mỗi người phụ trách một khối nhất định: có thể là CPU, có thể là hệ thống bộ nhớ, cũng có thể là phần kết nối giữa các chip. Song người trong ngành luôn được kỳ vọng phải hiểu cả hệ thống bao quanh khối của mình. Lý do rất thực tế: thêm một tính năng vào khối này gần như bao giờ cũng làm thay đổi việc mà các khối bên cạnh phải gánh. Vì vậy kiến trúc sư dành nhiều thời gian trao đổi với những người phụ trách các khối kế bên.
The same logic shapes how a chip begins. A new design starts with a team of architects deciding together what the chip will be: how many CPUs and GPUs it carries, how much memory, and what technology joins them. Only after that high-level design is settled does the work go deep into each unit.
Cách một con chip ra đời cũng theo đúng logic ấy. Bản thiết kế mới bắt đầu khi cả nhóm kiến trúc sư ngồi lại để quyết định con chip sẽ là gì: có bao nhiêu CPU, bao nhiêu GPU, bao nhiêu bộ nhớ, và dùng công nghệ gì để nối chúng lại. Chỉ khi bản thiết kế tổng thể ấy đã ổn định, công việc mới đi sâu vào từng khối.
A CPU has to run almost any program well
CPU phải chạy tốt gần như mọi chương trình
For thirty or forty years the defining aim of CPU design has been to run almost any program well. A CPU has to handle the operating system, compilers that turn code into machine instructions, office software on a desktop, and heavy scientific jobs such as weather forecasts and simulations in physics and chemistry. That variety explains each of its main parts.
Suốt ba, bốn mươi năm qua, mục tiêu cốt lõi của thiết kế CPU là chạy tốt gần như mọi loại chương trình. CPU phải gánh hệ điều hành, các trình biên dịch (compiler) chuyển mã nguồn thành lệnh máy và phần mềm văn phòng trên máy tính để bàn. Nó còn phải chạy những bài toán khoa học nặng như dự báo thời tiết hay mô phỏng vật lý, hóa học. Chính sự đa dạng ấy giải thích từng bộ phận chính của nó.
The arithmetic logic units (ALUs) do the actual calculating: adding, subtracting, multiplying, comparing numbers and combining bits. Because a CPU must be ready for every kind of program, its ALUs are large and capable, and they sit inside powerful cores. A core is an independent processing unit that can run a program on its own, and a large share of its area goes to machinery that looks ahead through the program, starts several instructions at once and runs them out of their written order whenever that is safe. This approach is called out-of-order execution, and it means the core rarely has to wait.4.1 Server CPUs today carry up to a few hundred of these cores.4.2
ALU là nơi thực sự làm tính: cộng, trừ, nhân, so sánh các con số và kết hợp các bit. Vì CPU phải sẵn sàng cho mọi loại chương trình, các ALU của nó lớn và làm được nhiều loại phép tính, và chúng nằm trong những lõi (core) mạnh. Mỗi lõi là một đơn vị xử lý độc lập, có thể tự chạy một chương trình. Một phần lớn diện tích của lõi dành cho bộ máy nhìn trước các lệnh sắp tới, khởi động nhiều lệnh cùng lúc và chạy chúng khác với thứ tự đã viết mỗi khi làm vậy an toàn. Cách làm này gọi là out-of-order execution (thực thi không theo thứ tự), và nhờ nó, lõi hiếm khi phải ngồi chờ.4.1 CPU dành cho máy chủ ngày nay có tới vài trăm lõi như vậy.4.2
Next to them sits the control logic, and one of its main jobs is branch prediction. Complicated programs are full of forks: if this is true, do one thing, otherwise do another. At each fork the CPU guesses which way to go and carries on. When the guess is right, no time is lost; when it is wrong, the work is thrown away and redone. Guessing well across many different programs takes a lot of complex logic.
Bên cạnh các ALU là khối điều khiển (control logic), và một trong những việc chính của nó là branch prediction. Chương trình phức tạp đầy những “ngã rẽ”: nếu điều này đúng thì làm việc này, không thì làm việc kia. Đến mỗi ngã rẽ, CPU đoán trước hướng đi rồi cứ thế chạy tiếp. Đoán đúng thì không mất chút thời gian nào; đoán sai thì phần việc đã làm bị bỏ đi và phải làm lại. Để đoán giỏi trên đủ loại chương trình, khối điều khiển phải rất phức tạp.
The third part is memory. A program’s data lives in DRAM, the main memory, which is large but far from the cores and slow to reach. So a CPU keeps several layers of cache on the chip: small, fast memories that hold the data it is likely to need next. This memory hierarchy, from tiny and fast to large and slow, lets a complex program finish in as short a time as possible.4.3 It also takes up a large share of the chip.
Bộ phận thứ ba là bộ nhớ. Dữ liệu của chương trình nằm trong DRAM, bộ nhớ chính, dung lượng lớn nhưng ở xa các lõi và truy cập chậm. Vì vậy CPU đặt ngay trên chip nhiều tầng cache: những bộ nhớ nhỏ, nhanh, giữ sẵn dữ liệu mà nó nhiều khả năng sắp cần. Memory hierarchy này, đi từ rất nhỏ và rất nhanh đến rất lớn và chậm, giúp một chương trình phức tạp chạy xong trong thời gian ngắn nhất có thể.4.3 Nó cũng chiếm một phần đáng kể diện tích con chip.
A GPU uses thousands of small cores to work in parallel
GPU dùng hàng nghìn lõi nhỏ để xử lý song song
A GPU takes the opposite approach: it runs the same simple program on a great many pieces of data at the same time, an approach called parallel processing. The work was drawing images at first: every pixel on the screen needs a similar small calculation, and none of them has to wait for another.
GPU chọn hướng ngược lại: nó chạy cùng một chương trình đơn giản trên thật nhiều phần dữ liệu cùng lúc, cách làm được gọi là xử lý song song. Ban đầu việc của nó là vẽ hình ảnh: mỗi điểm ảnh trên màn hình cần một phép tính nhỏ tương tự nhau, và không điểm nào phải chờ điểm nào.
That changes how the space on the chip is spent. Each ALU in a GPU is small, because its operations are simple. It needs little control logic, because one control unit steers a whole group of ALUs through the same instruction at once. And its caches are much smaller for each core than a CPU’s. To make up for them, a GPU keeps a great many pieces of work in flight, and when one has to wait for data from memory it runs another, so the wait is hidden behind useful work.4.4 The area saved goes into more ALUs, so where a CPU has tens, or at most a few hundred, large cores, a GPU has thousands of small ones.
Điều đó thay đổi cách phân bổ diện tích trên chip. Mỗi ALU trong GPU đều nhỏ, vì các phép tính nó đảm nhận đơn giản. GPU cần ít khối điều khiển, vì chỉ một khối điều khiển là đủ để cả một nhóm ALU cùng thực hiện một lệnh một lúc. Tính trên mỗi lõi, cache của nó cũng nhỏ hơn nhiều so với CPU. Để bù lại, GPU giữ sẵn rất nhiều phần việc đang dở, và khi một phần phải chờ dữ liệu từ bộ nhớ thì nó chạy phần khác, nên thời gian chờ được lấp bằng việc có ích.4.4 Phần diện tích tiết kiệm được dành để đặt thêm ALU, nên nếu CPU có vài chục, nhiều lắm vài trăm lõi lớn, thì GPU có hàng nghìn lõi nhỏ.
NVIDIA’s own programming guide describes the difference the same way: a GPU spends more of its transistors on processing data, and fewer on caching data and controlling the flow of a program.4.4, 4.5
Tài liệu hướng dẫn lập trình của NVIDIA cũng mô tả khác biệt này đúng như vậy: GPU dành nhiều bóng bán dẫn (transistor) hơn cho xử lý dữ liệu, và ít hơn cho cache và điều khiển luồng chương trình.4.4, 4.5
A GPU core is not a small copy of a CPU core. It is a much simpler unit that does well only when there are thousands of others working beside it on the same kind of task. Give a GPU one long, twisting program and a CPU will usually finish first.
Một lõi GPU không phải là bản thu nhỏ của lõi CPU. Đó là một đơn vị đơn giản hơn nhiều, chỉ phát huy sức mạnh khi có hàng nghìn lõi khác cùng làm một loại việc bên cạnh. Với một chương trình dài và nhiều ngã rẽ, CPU thường chạy xong trước GPU.
A CPU aims for low latency, a GPU for high throughput
CPU nhắm tới latency thấp, GPU nhắm tới throughput cao
The two designs follow two philosophies. Latency is the time one task takes from start to finish. Throughput is how much work gets done in a given time. A CPU is latency-oriented: its large cores, clever control and deep caches exist to finish each task as soon as possible. A GPU is throughput-oriented: any single task on it may take longer, but thousands of them finish together.
Hai kiểu thiết kế ấy đi theo hai triết lý. Latency là thời gian một tác vụ cần để đi từ đầu đến cuối. Throughput là khối lượng công việc làm xong trong một khoảng thời gian. CPU được thiết kế hướng latency: lõi lớn, khối điều khiển thông minh và cache nhiều tầng đều nhằm hoàn thành từng tác vụ sớm nhất có thể. GPU thì hướng throughput: mỗi tác vụ riêng lẻ có thể chậm hơn, nhưng hàng nghìn tác vụ cùng xong một lúc.
Think of a sports car and a bus. The car gets two people across town faster than anything else. The bus is slower, yet it moves fifty people in one trip. The CPU is the car and the GPU the bus: each is better at its own job, which is why most computers carry both.
Hãy hình dung một chiếc xe thể thao và một chiếc xe buýt. Xe thể thao đưa hai người băng qua thành phố nhanh hơn bất cứ thứ gì. Xe buýt chậm hơn, nhưng một chuyến chở được năm mươi người. CPU là chiếc xe thể thao, GPU là chiếc xe buýt: mỗi bên giỏi đúng việc của mình, và đó là lý do phần lớn máy tính đều có cả hai.