Thiết kế bộ xử lý để cung cấp hiệu suất cao không chỉ là tăng tốc độ xung nhịp. Có nhiều cách khác để tăng hiệu suất, được kích hoạt thông qua luật và công cụ của Moore để thiết kế bộ xử lý hiện đại.
Giá đồng hồ không thể tăng vô thời hạn.
Thoạt nhìn, có vẻ như bộ xử lý chỉ đơn giản thực hiện từng luồng hướng dẫn, với hiệu suất tăng đạt được thông qua tốc độ xung nhịp cao hơn. Tuy nhiên, chỉ tăng tốc độ xung nhịp là không đủ. Tiêu thụ điện năng và sản lượng nhiệt tăng khi tốc độ đồng hồ tăng.
Với tốc độ xung nhịp rất cao, việc tăng đáng kể điện áp lõi CPU trở nên cần thiết. Do TDP tăng theo bình phương của lõi V , cuối cùng chúng ta đạt đến điểm tiêu thụ năng lượng quá mức, sản lượng nhiệt và yêu cầu làm mát ngăn chặn tốc độ xung nhịp tăng thêm. Giới hạn này đã đạt được vào năm 2004, vào thời của Pentium 4 Prescott . Trong khi những cải tiến gần đây về hiệu suất năng lượng đã giúp ích, việc tăng đáng kể tốc độ xung nhịp không còn khả thi. Xem: Tại sao các nhà sản xuất CPU ngừng tăng tốc độ xung nhịp của bộ xử lý của họ?
Đồ thị tốc độ đồng hồ chứng khoán trong các máy tính đam mê tiên tiến trong những năm qua. Nguồn hình ảnh
- Thông qua định luật Moore , một quan sát cho biết số lượng bóng bán dẫn trên một mạch tích hợp tăng gấp đôi cứ sau 18 đến 24 tháng, chủ yếu là do co ngót , một loạt các kỹ thuật làm tăng hiệu suất đã được thực hiện. Những kỹ thuật này đã được cải tiến và hoàn thiện qua nhiều năm, cho phép thực hiện nhiều hướng dẫn hơn trong một khoảng thời gian nhất định. Những kỹ thuật này được thảo luận dưới đây.
Dường như các luồng hướng dẫn tuần tự thường có thể được song song.
- Mặc dù một chương trình có thể chỉ đơn giản bao gồm một loạt các hướng dẫn để thực hiện lần lượt từng lệnh khác, những hướng dẫn này hoặc các phần của chúng có thể được thực thi đồng thời. Điều này được gọi là song song mức hướng dẫn (ILP) . Khai thác ILP là rất quan trọng để đạt được hiệu suất cao và các bộ xử lý hiện đại sử dụng nhiều kỹ thuật để làm như vậy.
Đường ống phá vỡ các hướng dẫn thành các phần nhỏ hơn có thể được thực hiện song song.
Mỗi lệnh có thể được chia thành một chuỗi các bước, mỗi bước được thực hiện bởi một phần riêng biệt của bộ xử lý. Hướng dẫn đường ống cho phép nhiều hướng dẫn đi qua các bước này lần lượt mà không phải đợi mỗi hướng dẫn hoàn thành. Pipelining cho phép tốc độ xung nhịp cao hơn: bằng cách hoàn thành một bước của mỗi hướng dẫn trong mỗi chu kỳ đồng hồ, sẽ cần ít thời gian hơn cho mỗi chu kỳ so với khi toàn bộ các hướng dẫn phải được hoàn thành một lần.
Các đường ống dẫn RISC cổ điển chứa năm giai đoạn: hướng dẫn lấy, hướng dẫn giải mã, thực hiện hướng dẫn, truy cập bộ nhớ, và writeback. Bộ xử lý hiện đại chia nhỏ việc thực hiện thành nhiều bước nữa, tạo ra một đường ống sâu hơn với nhiều giai đoạn hơn (và tăng tốc độ xung nhịp có thể đạt được vì mỗi giai đoạn nhỏ hơn và mất ít thời gian hơn để hoàn thành), nhưng mô hình này sẽ cung cấp hiểu biết cơ bản về cách thức hoạt động của đường ống.
Nguồn hình ảnh
Tuy nhiên, đường ống có thể đưa ra các mối nguy hiểm phải được giải quyết để đảm bảo thực hiện chương trình chính xác.
Bởi vì các phần khác nhau của mỗi lệnh đang được thực thi cùng một lúc, có thể xảy ra xung đột gây cản trở việc thực hiện đúng. Chúng được gọi là mối nguy hiểm . Có ba loại mối nguy hiểm: dữ liệu, cấu trúc và kiểm soát.
Nguy cơ dữ liệu xảy ra khi các hướng dẫn đọc và sửa đổi cùng một dữ liệu cùng một lúc hoặc sai thứ tự, có khả năng dẫn đến kết quả không chính xác. Nguy cơ cấu trúc xảy ra khi nhiều hướng dẫn cần sử dụng một phần cụ thể của bộ xử lý cùng một lúc. Các mối nguy kiểm soát xảy ra khi gặp một lệnh rẽ nhánh có điều kiện.
Những mối nguy hiểm này có thể được giải quyết theo nhiều cách khác nhau. Giải pháp đơn giản nhất là đơn giản là trì hoãn đường ống, tạm thời thực hiện một hoặc các hướng dẫn trong đường ống để đảm bảo kết quả chính xác. Điều này được tránh bất cứ khi nào có thể vì nó làm giảm hiệu suất. Đối với các mối nguy dữ liệu, các kỹ thuật như chuyển tiếp toán hạng được sử dụng để giảm các quầy hàng. Các mối nguy kiểm soát được xử lý thông qua dự đoán chi nhánh , đòi hỏi phải xử lý đặc biệt và được đề cập trong phần tiếp theo.
Dự đoán nhánh được sử dụng để giải quyết các mối nguy kiểm soát có thể phá vỡ toàn bộ đường ống.
Các mối nguy kiểm soát, xảy ra khi gặp phải một nhánh có điều kiện , đặc biệt nghiêm trọng. Các nhánh giới thiệu khả năng thực thi sẽ tiếp tục ở nơi khác trong chương trình chứ không chỉ đơn giản là hướng dẫn tiếp theo trong luồng lệnh, dựa trên việc một điều kiện cụ thể là đúng hay sai.
Bởi vì lệnh tiếp theo để thực thi không thể được xác định cho đến khi điều kiện nhánh được ước tính, không thể chèn bất kỳ lệnh nào vào đường ống sau khi một nhánh vắng mặt. Do đó, đường ống được làm trống ( xả ) có thể lãng phí gần như nhiều chu kỳ đồng hồ như có các giai đoạn trong đường ống. Các nhánh có xu hướng xảy ra rất thường xuyên trong các chương trình, vì vậy các mối nguy kiểm soát có thể ảnh hưởng nghiêm trọng đến hiệu suất của bộ xử lý.
Dự đoán chi nhánh giải quyết vấn đề này bằng cách đoán xem một chi nhánh sẽ được thực hiện. Cách đơn giản nhất để làm điều này chỉ đơn giản là giả định rằng các nhánh luôn được lấy hoặc không bao giờ lấy. Tuy nhiên, bộ xử lý hiện đại sử dụng các kỹ thuật tinh vi hơn nhiều để có độ chính xác dự đoán cao hơn. Về bản chất, bộ xử lý theo dõi các nhánh trước và sử dụng thông tin này theo bất kỳ cách nào để dự đoán lệnh tiếp theo sẽ thực thi. Đường ống sau đó có thể được cung cấp với các hướng dẫn từ vị trí chính xác dựa trên dự đoán.
Tất nhiên, nếu dự đoán là sai, bất kỳ hướng dẫn nào đã được đưa qua đường ống sau khi chi nhánh phải được loại bỏ, do đó làm trôi đường ống. Do đó, độ chính xác của bộ dự báo nhánh trở nên ngày càng quan trọng khi các đường ống ngày càng dài hơn. Các kỹ thuật dự đoán chi nhánh cụ thể nằm ngoài phạm vi của câu trả lời này.
Bộ nhớ cache được sử dụng để tăng tốc truy cập bộ nhớ.
Bộ xử lý hiện đại có thể thực thi các hướng dẫn và xử lý dữ liệu nhanh hơn nhiều so với chúng có thể được truy cập trong bộ nhớ chính. Khi bộ xử lý phải truy cập RAM, việc thực thi có thể bị đình trệ trong thời gian dài cho đến khi dữ liệu có sẵn. Để giảm thiểu hiệu ứng này, các vùng bộ nhớ tốc độ cao nhỏ được gọi là bộ nhớ cache được đưa vào bộ xử lý.
Do không gian hạn chế có sẵn trên bộ xử lý chết, bộ nhớ cache có kích thước rất hạn chế. Để tận dụng tối đa khả năng hạn chế này, cache chỉ lưu trữ dữ liệu gần đây nhất hoặc thường xuyên truy cập ( địa phương tạm thời ). Vì các truy cập bộ nhớ có xu hướng được phân cụm trong các khu vực cụ thể ( địa phương không gian ), các khối dữ liệu gần những gì được truy cập gần đây cũng được lưu trữ trong bộ đệm. Xem: Địa phương tham khảo
Bộ nhớ cache cũng được tổ chức theo nhiều cấp độ khác nhau để tối ưu hóa hiệu suất vì bộ nhớ cache lớn hơn có xu hướng chậm hơn bộ nhớ cache nhỏ hơn. Ví dụ: bộ xử lý có thể có bộ đệm cấp 1 (L1) chỉ có kích thước 32 KB, trong khi bộ đệm cấp 3 (L3) của nó có thể lớn vài megabyte. Kích thước của bộ đệm, cũng như tính kết hợp của bộ đệm, ảnh hưởng đến cách bộ xử lý quản lý việc thay thế dữ liệu trên bộ đệm đầy đủ, ảnh hưởng đáng kể đến hiệu suất đạt được thông qua bộ đệm.
Thực hiện không theo thứ tự làm giảm các quầy hàng do các mối nguy hiểm bằng cách cho phép các hướng dẫn độc lập thực hiện trước.
Không phải mọi hướng dẫn trong một luồng hướng dẫn đều phụ thuộc vào nhau. Ví dụ, mặc dù a + b = c
phải được thực thi trước đó c + d = e
, a + b = c
và d + e = f
độc lập và có thể được thực thi cùng một lúc.
Thực thi không theo thứ tự lợi dụng thực tế này để cho phép các lệnh khác, độc lập thực thi trong khi một lệnh bị đình trệ. Thay vì yêu cầu các hướng dẫn thực hiện lần lượt từng bước, lập lịch phần cứng được thêm vào để cho phép các hướng dẫn độc lập được thực hiện theo bất kỳ thứ tự nào. Các hướng dẫn được gửi đến một hàng đợi lệnh và được cấp cho phần thích hợp của bộ xử lý khi có sẵn dữ liệu cần thiết. Theo cách đó, các hướng dẫn bị kẹt khi chờ dữ liệu từ một hướng dẫn trước đó không kết hợp các hướng dẫn sau đó độc lập.
Nguồn hình ảnh
- Một số cấu trúc dữ liệu mới và mở rộng được yêu cầu để thực hiện thực hiện không theo thứ tự. Hàng đợi lệnh đã nói ở trên, trạm đặt trước , được sử dụng để giữ các hướng dẫn cho đến khi dữ liệu cần thiết để thực hiện có sẵn. Bộ đệm thứ tự lại (ROB) được sử dụng để theo dõi trạng thái của các hướng dẫn đang diễn ra, theo thứ tự mà chúng đã được nhận, để các hướng dẫn được hoàn thành theo đúng thứ tự. Một tệp đăng ký vượt quá số lượng các thanh ghi được cung cấp bởi chính kiến trúc là cần thiết để đổi tên thanh ghi , giúp ngăn chặn các hướng dẫn độc lập khác trở nên phụ thuộc do nhu cầu chia sẻ bộ thanh ghi giới hạn do kiến trúc cung cấp.
Kiến trúc siêu khối cho phép nhiều lệnh trong một luồng lệnh thực thi cùng một lúc.
Các kỹ thuật được thảo luận ở trên chỉ làm tăng hiệu suất của đường ống dẫn. Các kỹ thuật này không cho phép nhiều hơn một hướng dẫn được hoàn thành trong mỗi chu kỳ đồng hồ. Tuy nhiên, thường có thể thực hiện song song các lệnh riêng lẻ trong một luồng lệnh, chẳng hạn như khi chúng không phụ thuộc vào nhau (như đã thảo luận trong phần thực hiện không theo thứ tự ở trên).
Các kiến trúc Superscalar tận dụng sự song song ở cấp độ hướng dẫn này bằng cách cho phép các hướng dẫn được gửi đến nhiều đơn vị chức năng cùng một lúc. Bộ xử lý có thể có nhiều đơn vị chức năng của một loại cụ thể (như ALU số nguyên) và / hoặc các loại đơn vị chức năng khác nhau (chẳng hạn như đơn vị dấu phẩy động và số nguyên) mà các lệnh có thể được gửi đồng thời.
Trong bộ xử lý siêu khối, các hướng dẫn được lên lịch như trong một thiết kế không theo thứ tự, nhưng hiện có nhiều cổng vấn đề , cho phép các hướng dẫn khác nhau được ban hành và thực thi cùng một lúc. Mạch giải mã lệnh mở rộng cho phép bộ xử lý đọc một số lệnh tại một thời điểm trong mỗi chu kỳ đồng hồ và xác định mối quan hệ giữa chúng. Một bộ xử lý hiệu suất cao hiện đại có thể lên lịch lên tới tám lệnh cho mỗi chu kỳ đồng hồ, tùy thuộc vào mỗi lệnh được thực hiện. Đây là cách bộ xử lý có thể hoàn thành nhiều hướng dẫn trong mỗi chu kỳ đồng hồ. Xem: Công cụ thực thi Haswell trên AnandTech
Nguồn hình ảnh
- Tuy nhiên, kiến trúc siêu khối rất khó thiết kế và tối ưu hóa. Kiểm tra sự phụ thuộc giữa các hướng dẫn đòi hỏi logic rất phức tạp có kích thước có thể mở rộng theo cấp số nhân khi số lượng lệnh đồng thời tăng lên. Ngoài ra, tùy thuộc vào ứng dụng, chỉ có một số lượng hướng dẫn giới hạn trong mỗi luồng hướng dẫn có thể được thực thi cùng một lúc, vì vậy những nỗ lực để tận dụng lợi thế lớn hơn của ILP phải chịu lợi nhuận giảm dần.
Các hướng dẫn nâng cao hơn được thêm vào để thực hiện các thao tác phức tạp trong thời gian ngắn hơn.
Khi ngân sách bóng bán dẫn tăng lên, có thể thực hiện các hướng dẫn nâng cao hơn cho phép các hoạt động phức tạp được thực hiện trong một phần nhỏ thời gian mà chúng sẽ thực hiện. Các ví dụ bao gồm các tập lệnh vectơ như SSE và AVX thực hiện tính toán trên nhiều phần dữ liệu cùng một lúc và tập lệnh AES giúp tăng tốc mã hóa và giải mã dữ liệu.
Để thực hiện các hoạt động phức tạp này, các bộ xử lý hiện đại sử dụng các hoạt động vi mô (μops) . Các hướng dẫn phức tạp được giải mã thành các chuỗi μops, được lưu trữ bên trong một bộ đệm chuyên dụng và được lên lịch để thực hiện riêng lẻ (trong phạm vi cho phép bởi các phụ thuộc dữ liệu). Điều này cung cấp nhiều chỗ hơn cho bộ xử lý để khai thác ILP. Để tăng cường hơn nữa hiệu năng, có thể sử dụng bộ đệm cache đặc biệt để lưu trữ ops đã giải mã gần đây, để có thể tra cứu nhanh chóng các lệnh cho các lệnh được thực hiện gần đây.
Tuy nhiên, việc bổ sung các hướng dẫn này không tự động tăng hiệu suất. Hướng dẫn mới có thể tăng hiệu suất chỉ khi một ứng dụng được viết để sử dụng chúng. Việc chấp nhận các hướng dẫn này bị cản trở bởi thực tế là các ứng dụng sử dụng chúng sẽ không hoạt động trên các bộ xử lý cũ không hỗ trợ chúng.
Vậy làm thế nào để những kỹ thuật này cải thiện hiệu suất của bộ xử lý theo thời gian?
Đường ống đã trở nên dài hơn qua nhiều năm, giảm lượng thời gian cần thiết để hoàn thành từng giai đoạn và do đó cho phép tốc độ xung nhịp cao hơn. Tuy nhiên, trong số những thứ khác, các đường ống dài hơn làm tăng hình phạt cho dự đoán nhánh không chính xác, do đó, một đường ống không thể quá dài. Khi cố gắng đạt tốc độ xung nhịp rất cao, bộ xử lý Pentium 4 đã sử dụng các đường ống rất dài, lên tới 31 giai đoạn trong Prescott . Để giảm thâm hụt hiệu suất, bộ xử lý sẽ cố gắng thực hiện các hướng dẫn ngay cả khi chúng có thể thất bại và sẽ tiếp tục thử cho đến khi chúng thành công . Điều này dẫn đến mức tiêu thụ năng lượng rất cao và giảm hiệu suất đạt được từ siêu phân luồng . Các bộ xử lý mới hơn không còn sử dụng các đường ống này lâu nữa, đặc biệt là khi tỷ lệ xung nhịp đã đạt đến một bức tường;Haswell sử dụng một đường ống dài từ 14 đến 19 giai đoạn và các kiến trúc công suất thấp hơn sử dụng các đường ống ngắn hơn (Intel Atom Silvermont có 12 đến 14 giai đoạn).
Độ chính xác của dự đoán nhánh đã được cải thiện với các kiến trúc tiên tiến hơn, giảm tần suất xả đường ống do gây ra sai lầm và cho phép thực hiện đồng thời nhiều hướng dẫn hơn. Xem xét độ dài của đường ống trong bộ xử lý ngày nay, điều này rất quan trọng để duy trì hiệu suất cao.
Với ngân sách bóng bán dẫn ngày càng tăng, bộ nhớ cache lớn hơn và hiệu quả hơn có thể được nhúng trong bộ xử lý, giảm các quầy hàng do truy cập bộ nhớ. Truy cập bộ nhớ có thể cần hơn 200 chu kỳ để hoàn thành trên các hệ thống hiện đại, vì vậy điều quan trọng là giảm nhu cầu truy cập bộ nhớ chính càng nhiều càng tốt.
Các bộ xử lý mới hơn có khả năng tận dụng ILP tốt hơn thông qua logic thực thi siêu thanh tiên tiến hơn và các thiết kế "rộng hơn" cho phép nhiều lệnh được giải mã và thực thi đồng thời. Các Haswell kiến trúc có thể giải mã bốn lệnh và cử 8 vi hoạt động mỗi chu kỳ đồng hồ. Tăng ngân sách bóng bán dẫn cho phép nhiều đơn vị chức năng hơn như ALU nguyên được đưa vào lõi bộ xử lý. Các cấu trúc dữ liệu chính được sử dụng trong thực thi không theo thứ tự và siêu thực, như trạm đặt trước, sắp xếp lại bộ đệm và tệp đăng ký, được mở rộng trong các thiết kế mới hơn, cho phép bộ xử lý tìm kiếm một cửa sổ hướng dẫn rộng hơn để khai thác ILP của chúng. Đây là một động lực chính đằng sau sự gia tăng hiệu suất trong các bộ xử lý ngày nay.
Các hướng dẫn phức tạp hơn được bao gồm trong các bộ xử lý mới hơn và ngày càng có nhiều ứng dụng sử dụng các hướng dẫn này để nâng cao hiệu suất. Những tiến bộ trong công nghệ trình biên dịch, bao gồm các cải tiến trong lựa chọn hướng dẫn và vector hóa tự động , cho phép sử dụng hiệu quả hơn các hướng dẫn này.
Ngoài những điều trên, việc tích hợp nhiều hơn các bộ phận bên ngoài trước đó vào CPU như cầu bắc, bộ điều khiển bộ nhớ và các làn PCIe làm giảm I / O và độ trễ bộ nhớ. Điều này làm tăng thông lượng bằng cách giảm các quầy hàng gây ra bởi sự chậm trễ trong việc truy cập dữ liệu từ các thiết bị khác.