Mục lục bài họcĐang ở d10-b1
Processor architecture: RISC, CISC and pipelining
Two design philosophies
CISC provides many complex instructions, each able to do a lot, so a program needs fewer instructions but each one may take several clock cycles and the hardware is complicated. RISC provides a small set of simple instructions, each designed to complete in one cycle, so programs are longer but the hardware is simpler, uses less power and is easier to pipeline.
Why RISC won in mobile devices
Simpler hardware means lower power consumption and less heat — decisive for a phone running on a battery. The compiler does more work to turn one complex operation into several simple instructions, and that is an acceptable trade because compilation happens once while execution happens billions of times.
Pipelining
Instead of finishing one instruction before starting the next, the processor overlaps them: while instruction $1$ is being executed, instruction $2$ is being decoded and instruction $3$ fetched. With $4$ stages, four instructions take $7$ cycles instead of $16$.
The catch is a branch. When a jump is taken, the instructions already in the pipeline are the wrong ones and must be discarded, which is why processors use branch prediction to guess which way a conditional jump will go.
Parallel processing
SISD is a single processor on a single data stream. SIMD applies the same instruction to many data items at once — the model behind graphics processors, image filters and much machine learning. MIMD runs different instructions on different data, which is what a multi-core general-purpose processor does.
Why more cores does not mean proportionally more speed
A program only speeds up if the work can be divided; the part that must run sequentially sets a floor on the total time no matter how many cores are added. Add the cost of coordinating cores and sharing memory, and doubling cores rarely halves the run time — that is the evaluation point.
Hai triết lý thiết kế
CISC cung cấp nhiều lệnh phức tạp, mỗi lệnh làm được nhiều việc, nên chương trình cần ít lệnh hơn nhưng mỗi lệnh có thể mất vài chu kỳ và phần cứng thì phức tạp. RISC cung cấp một tập nhỏ các lệnh đơn giản, mỗi lệnh được thiết kế để xong trong một chu kỳ, nên chương trình dài hơn nhưng phần cứng đơn giản hơn, tốn ít điện hơn và dễ làm đường ống hơn.
Vì sao RISC thắng ở thiết bị di động
Phần cứng đơn giản hơn nghĩa là tiêu thụ điện thấp hơn và toả ít nhiệt hơn — yếu tố quyết định với một chiếc điện thoại chạy bằng pin. Trình biên dịch phải làm nhiều việc hơn để biến một thao tác phức tạp thành vài lệnh đơn giản, và đó là đánh đổi chấp nhận được vì việc biên dịch chỉ làm một lần trong khi việc thực thi diễn ra hàng tỷ lần.
Đường ống lệnh
Thay vì làm xong một lệnh rồi mới bắt đầu lệnh sau, bộ xử lý cho chúng chồng lên nhau: trong lúc lệnh $1$ đang được thực hiện thì lệnh $2$ đang được giải mã và lệnh $3$ đang được nạp. Với $4$ pha, bốn lệnh mất $7$ chu kỳ thay vì $16$.
Vấn đề nằm ở lệnh rẽ nhánh. Khi một lệnh nhảy được thực hiện, các lệnh đã nằm sẵn trong đường ống là những lệnh SAI và phải bị xoá đi, và đó là lý do bộ xử lý dùng dự đoán rẽ nhánh để đoán xem một lệnh nhảy có điều kiện sẽ đi hướng nào.
Xử lý song song
SISD là một bộ xử lý trên một luồng dữ liệu. SIMD áp cùng một lệnh lên nhiều dữ liệu cùng lúc — mô hình đứng sau bộ xử lý đồ hoạ, các bộ lọc ảnh và phần lớn học máy. MIMD chạy các lệnh khác nhau trên các dữ liệu khác nhau, và đó chính là cách một bộ xử lý đa nhân đa dụng hoạt động.
Vì sao nhiều nhân hơn không cho tốc độ tăng tương ứng
Một chương trình chỉ nhanh lên nếu công việc chia được; phần bắt buộc phải chạy tuần tự đặt ra một mức sàn cho tổng thời gian bất kể thêm bao nhiêu nhân. Cộng thêm chi phí điều phối giữa các nhân và chia sẻ bộ nhớ, nhân đôi số nhân hiếm khi làm thời gian chạy giảm một nửa — và đó là ý ăn điểm đánh giá.
(a) Một bộ xử lý có $5$ pha đường ống, mỗi pha $1$ chu kỳ. Tính số chu kỳ cần cho $100$ lệnh, có và không có đường ống.
(b) Một chương trình có $30\%$ khối lượng công việc bắt buộc chạy tuần tự. Giải thích vì sao tăng từ $4$ lên $8$ nhân không làm chương trình nhanh gấp đôi.
(a) Không có đường ống. Mỗi lệnh phải đi hết $5$ pha rồi lệnh sau mới bắt đầu.
Số chu kỳ $=100\times5=\mathbf{500}$ chu kỳ.
Có đường ống. Lệnh đầu tiên mất đủ $5$ chu kỳ để đi hết đường ống; sau đó mỗi chu kỳ có thêm một lệnh hoàn thành.
Số chu kỳ $=5+(100-1)=\mathbf{104}$ chu kỳ.
Nhanh hơn khoảng $4{,}8$ lần — gần bằng số pha, và đó là quy luật chung: với $n$ pha, lợi ích tối đa tiệm cận $n$ lần khi số lệnh đủ lớn.
Nhưng đây là con số lý tưởng. Trong thực tế, mỗi lệnh nhảy được thực hiện buộc phải xoá các lệnh đã nạp sai và nạp lại từ đầu, mất khoảng $4$ chu kỳ. Một chương trình có nhiều vòng lặp và rẽ nhánh sẽ không đạt được mức $4{,}8$ lần này.
(b) Vì sao $8$ nhân không nhanh gấp đôi $4$ nhân.
Chỉ $70\%$ khối lượng công việc chia được cho nhiều nhân; $30\%$ còn lại phải chạy tuần tự và không nhanh lên chút nào dù có bao nhiêu nhân.
Giả sử một nhân mất $100$ đơn vị thời gian:
Với $4$ nhân: $30+\dfrac{70}{4}=30+17{,}5=47{,}5$ đơn vị.
Với $8$ nhân: $30+\dfrac{70}{8}=30+8{,}75=38{,}75$ đơn vị.
Nhân đôi số nhân chỉ giảm thời gian khoảng $18\%$, chứ không phải $50\%$.
Giới hạn tuyệt đối: ngay cả với vô hạn nhân, thời gian không xuống dưới $30$ đơn vị — tức nhanh nhất cũng chỉ được $3{,}3$ lần. Phần tuần tự đặt ra một mức sàn không vượt qua được.
Thêm chi phí thực tế: nhiều nhân hơn còn kéo theo chi phí điều phối và tranh chấp bộ nhớ dùng chung, nên con số thực tế còn kém hơn $38{,}75$ đơn vị đã tính ở trên.
Đọc xong rồi — làm thử ngay
Bài tập của chương Advanced Architecture, Networks and Computational Thinking gồm 14 câu trắc nghiệm và 3 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.