Câu hỏi hay, hoặc ít nhất một câu trả lời thú vị. Một phần của câu trả lời này hình ảnh một thế giới nơi CPU có thể mở rộng hiệu quả theo chiều rộng thay vì có nhiều lõi riêng biệt. Mô hình cấp phép / giá sẽ khác nhau!
Phần còn lại giải thích lý do tại sao họ không thể. Tóm lược:
- Chi phí của quy mô nhiều lõi gần với tuyến tính
- Chi phí mở rộng quy mô đường ống siêu lớp 1 lõi ~ bậc hai Điều này có thể thực hiện được với lực lượng vũ phu đủ, dù sao cũng đến một điểm. Hiệu suất đơn luồng rất quan trọng đối với việc sử dụng tương tác (vấn đề độ trễ từ đầu đến cuối, không chỉ là thông lượng), vì vậy các CPU cao cấp lõi lớn hiện tại phải trả giá đó. ví dụ: Skylake (4 chiều), Ryzen (5 hoặc 6 rộng) và A12 của Apple (rộng 7 cho lõi lớn, rộng 3 cho lõi nhỏ hiệu quả năng lượng)
- IPC giảm dần nghiêm trọng trả lại từ việc chỉ mở rộng đường ống vượt quá 3 hoặc 4 chiều, ngay cả khi thực hiện không theo thứ tự để tìm ILP . Chi nhánh bỏ lỡ và bộ nhớ cache là khó khăn, và vẫn còn toàn bộ đường ống.
Bạn đã không đề cập đến tần số, chỉ IPC, nhưng tần số mở rộng cũng khó. Tần số cao hơn đòi hỏi điện áp cao hơn, do đó thang đo công suất với tần số được tạo thành : ^1
từ tần số trực tiếp và^2
từ điện áp. (Tụ lưu trữ các thang đo năng lượng với V ^ 2, và hầu hết năng lượng động ngoài dòng rò là từ việc bơm điện vào tải điện dung của cổng FET + dây.)
Hiệu suất = tần số lần IPC. (Trong cùng một kiến trúc. SIMD rộng hơn cho phép bạn hoàn thành công việc tương tự với ít hướng dẫn hơn và một số ISA dày đặc hơn các cấu trúc khác, ví dụ: MIPS thường mất nhiều hướng dẫn để thực hiện cùng một công việc so với x86 hoặc AArch64.)
Chi phí nằm trong khu vực chết (chi phí sản xuất) và / hoặc năng lượng (gián tiếp hạn chế tần số vì làm mát là khó khăn). Ngoài ra, bản thân công suất và hiệu suất thấp hơn mỗi watt cũng là một mục tiêu, đặc biệt là cho thiết bị di động (pin) và máy chủ (mật độ năng lượng / chi phí làm mát / chi phí điện).
Trước khi đa lõi trên mỗi ổ cắm là một điều, bạn đã có hệ thống đa ổ cắm cho các trường hợp sử dụng cao cấp, nơi bạn muốn có nhiều thông lượng hơn mức có thể đạt được với một CPU có thể được sản xuất, vì vậy đó là những hệ thống SMP duy nhất. (Máy chủ, máy trạm cao cấp).
Nếu một lõi đơn có thể mở rộng hiệu quả như bạn mong muốn, chúng tôi sẽ có các hệ thống với 1 lõi vật lý trên mỗi ổ cắm và SMT (ví dụ HyperThreading) để cho phép chúng hoạt động như nhiều lõi logic. Máy tính để bàn / máy tính xách tay thông thường sẽ chỉ có 1 lõi vật lý và chúng tôi sẽ không đấu tranh để song song hóa những thứ không có quy mô tuyến tính với nhiều lõi hơn. ví dụ: make -j4
để tận dụng các máy chủ đa ổ cắm và / hoặc để ẩn độ trễ I / O trên máy tính để bàn. . trình bày SMT cho HĐH rất khác nhau, vì vậy các thuật toán lập lịch song song và khóa vẫn sẽ cần thiết ở đó.
Donald Knuth nói trong một cuộc phỏng vấn năm 2008
Tôi cũng có thể châm ngòi một chút về sự bất hạnh cá nhân của mình với xu hướng hiện tại đối với kiến trúc đa lõi. Đối với tôi, có vẻ như ít nhiều các nhà thiết kế phần cứng đã hết ý tưởng và họ đang cố gắng đổ lỗi cho sự sụp đổ trong tương lai của Định luật Moore cho các nhà văn phần mềm bằng cách cho chúng tôi các máy hoạt động nhanh hơn chỉ với một số điểm chuẩn chính!
Có, nếu chúng ta có thể có CPU lõi đơn kỳ diệu với thông lượng gấp 8 lần trên các chương trình thực , có lẽ chúng ta vẫn đang sử dụng chúng. Với các hệ thống ổ cắm kép chỉ khi nó đáng để trả nhiều hơn cho thông lượng nhiều hơn (không phải hiệu suất đơn luồng).
Nhiều CPU giảm chi phí chuyển đổi ngữ cảnh khi nhiều chương trình đang chạy (bằng cách cho phép chúng thực sự chạy song song thay vì chuyển đổi nhanh giữa chúng); đa nhiệm ưu tiên làm gián đoạn các máy móc không theo thứ tự khổng lồ mà CPU yêu cầu có thể sẽ còn gây tổn hại nhiều hơn bây giờ.
Về mặt vật lý, nó sẽ là lõi đơn (đối với hệ thống phân cấp bộ đệm đơn giản không có kết nối giữa các lõi) nhưng hỗ trợ SMT (ví dụ HyperThreading của Intel) để phần mềm có thể sử dụng nó như 8 lõi logic cạnh tranh linh hoạt cho các tài nguyên thông lượng. Hoặc khi chỉ có 1 luồng đang chạy / không bị đình trệ, nó sẽ nhận được toàn bộ lợi ích.
Vì vậy, bạn sẽ sử dụng nhiều luồng khi điều đó thực sự dễ dàng / tự nhiên hơn (ví dụ: các quy trình riêng biệt chạy cùng một lúc) hoặc cho các vấn đề dễ dàng song song với các chuỗi phụ thuộc sẽ ngăn chặn tối đa IPC của con thú này.
Nhưng thật không may, đó là suy nghĩ mong muốn của Knuth rằng CPU đa lõi sẽ không còn là một điều tại thời điểm này.
Chia tỷ lệ hiệu suất đơn luồng
Tôi nghĩ rằng nếu họ tạo ra 1 lõi tương đương với CPU 8 lõi, thì một lõi đó sẽ tăng 800% IPC để bạn có được hiệu suất đầy đủ trong tất cả các chương trình, không chỉ các lõi được tối ưu hóa cho nhiều lõi.
Vâng đó là sự thật. Nếu có thể xây dựng một CPU như vậy , nó sẽ rất tuyệt vời. Nhưng tôi nghĩ đó là nghĩa đen không thể trên cùng một quy trình sản xuất chất bán dẫn (nghĩa là cùng chất lượng / hiệu suất của bóng bán dẫn). Chắc chắn không thể có cùng ngân sách năng lượng và diện tích chết như CPU 8 lõi, mặc dù bạn sẽ tiết kiệm logic để dán các lõi lại với nhau và sẽ không cần nhiều không gian cho bộ nhớ riêng trên mỗi lõi.
Ngay cả khi bạn cho phép tăng tần số (vì tiêu chí thực sự là hoạt động mỗi giây, không hoạt động trên mỗi đồng hồ), làm cho ngay cả CPU nhanh hơn gấp 2 lần sẽ là một thách thức lớn.
Nếu có thể ở bất cứ nơi nào gần sức mạnh tương tự và ngân sách die-khu vực (như vậy, sản xuất chi phí) để xây dựng một CPU như vậy, có các nhà cung cấp CPU sẽ đã được xây dựng chúng theo cách đó.
Cụ thể là thêm Cores hay Wider Cores? phần, cho nền tảng cần thiết để hiểu câu trả lời này; nó bắt đầu đơn giản với cách CPU hoạt động theo thứ tự hoạt động, sau đó thay thế siêu tốc (nhiều hướng dẫn trên mỗi đồng hồ). Sau đó giải thích cách chúng ta chạm tường điện ngay trong kỷ nguyên P4, dẫn đến việc kết thúc việc mở rộng tần số dễ dàng, chủ yếu chỉ là IPC và thực hiện nhiều công việc hơn theo hướng dẫn (ví dụ SIMD) khi tiến về phía trước, ngay cả với các bóng bán dẫn nhỏ hơn.
Làm cho một đường ống rộng hơn (hướng dẫn tối đa trên mỗi đồng hồ) thường có tỷ lệ chi phí là bình phương chiều rộng . Chi phí đó được đo bằng diện tích và / hoặc công suất, để kiểm tra phụ thuộc song song rộng hơn (phát hiện nguy cơ) và bộ lập lịch ngoài đơn đặt hàng rộng hơn để tìm hướng dẫn sẵn sàng để chạy. Và nhiều cổng đọc / ghi hơn trên tệp đăng ký và bộ đệm của bạn nếu bạn muốn chạy các hướng dẫn khác nop
. Đặc biệt nếu bạn có các hướng dẫn 3 đầu vào như FMA hoặc add-with-carry (2 thanh ghi + cờ).
Ngoài ra còn có lợi nhuận IPC giảm dần để làm cho CPU rộng hơn ; hầu hết các khối lượng công việc đã giới hạn ILP quy mô nhỏ / phạm vi ngắn (Song song mức hướng dẫn) cho CPU để khai thác, do đó làm cho lõi rộng hơn không làm tăng IPC (hướng dẫn trên mỗi đồng hồ) nếu IPC bị giới hạn dưới độ rộng của cốt lõi bởi chuỗi phụ thuộc, bỏ lỡ chi nhánh, bỏ lỡ bộ nhớ cache hoặc các quầy hàng khác. Chắc chắn bạn sẽ tăng tốc trong một số vòng lặp không được kiểm soát với các lần lặp độc lập, nhưng đó không phải là điều mà hầu hết các mã dành phần lớn thời gian để làm. So sánh / hướng dẫn chi nhánh chiếm 20% hỗn hợp hướng dẫn trong mã "điển hình", IIRC. (Tôi nghĩ rằng tôi đã đọc các số từ 15 đến 25% cho các bộ dữ liệu khác nhau.)
Ngoài ra, một lỗi bộ nhớ cache lưu trữ tất cả các hướng dẫn phụ thuộc (và sau đó mọi thứ một khi đạt được dung lượng ROB) sẽ tốn nhiều chi phí hơn cho CPU rộng hơn. (Chi phí cơ hội của việc để nhiều đơn vị thực thi nhàn rỗi hơn; công việc tiềm năng hơn không được thực hiện.) Hoặc một chi nhánh bị bỏ lỡ tương tự gây ra bong bóng.
Để có được 8 lần IPC, chúng tôi cần ít nhất một sự cải thiện về độ chính xác dự đoán chi nhánh và tỷ lệ trúng bộ nhớ cache . Nhưng tốc độ nhấn bộ đệm không mở rộng tốt với dung lượng bộ đệm vượt qua một điểm nhất định đối với hầu hết các khối lượng công việc. Và HW tìm nạp trước là thông minh, nhưng không thể là thông minh. Và ở mức 8, IPC, các dự đoán nhánh cần tạo ra 8 lần dự đoán cho mỗi chu kỳ cũng như có chúng chính xác hơn.
Các kỹ thuật hiện tại để xây dựng CPU thực thi không theo thứ tự chỉ có thể tìm thấy ILP trong phạm vi ngắn . Ví dụ: kích thước ROB của Skylake là 224 uops miền hợp nhất, bộ lập lịch cho các uops không được thực thi là 97 miền không sử dụng. Xem Hiểu về tác động của lfence trên một vòng lặp với hai chuỗi phụ thuộc dài, để tăng độ dài cho trường hợp kích thước bộ lập lịch là yếu tố giới hạn trong việc trích xuất ILP từ 2 chuỗi lệnh dài, nếu chúng quá dài. Và / hoặc xem câu trả lời tổng quát và giới thiệu này ).
Vì vậy, việc tìm ILP giữa hai vòng dài riêng biệt không phải là điều chúng ta có thể làm với phần cứng. Việc biên dịch lại nhị phân động cho phản ứng tổng hợp vòng lặp có thể có thể xảy ra trong một số trường hợp, nhưng khó và không phải CPU nào đó thực sự có thể làm được trừ khi chúng đi theo lộ trình Transmeta Crusoe. (lớp mô phỏng x86 ở trên cùng của một ISA bên trong khác; trong trường hợp đó là VLIW). Nhưng các thiết kế x86 hiện đại tiêu chuẩn với bộ đệm uop và bộ giải mã mạnh mẽ không dễ bị đánh bại đối với hầu hết các mã.
Và ngoài x86, tất cả các ISA vẫn đang được sử dụng tương đối dễ giải mã, do đó không có động lực nào cho việc biên dịch lại động ngoài việc tối ưu hóa đường dài. TL: DR: hy vọng các trình biên dịch ma thuật có thể tiết lộ nhiều ILP hơn cho phần cứng đã không hoạt động đối với Itanium IA-64 và không có khả năng hoạt động cho CPU siêu rộng cho bất kỳ ISA hiện có nào với mô hình thực thi nối tiếp.
Nếu bạn đã có một CPU siêu rộng, bạn chắc chắn muốn nó hỗ trợ SMT để bạn có thể duy trì hoạt động của nó bằng cách chạy nhiều luồng ILP thấp.
Vì Skylake hiện rộng 4 uops (và đạt được IPC thực tế từ 2 đến 3 u mỗi đồng hồ, hoặc thậm chí gần hơn với 4 trong mã thông lượng cao), CPU rộng hơn 8 giả thuyết sẽ có chiều rộng 32!
Có thể khắc nó trở lại thành 8 hoặc 16 CPU logic có thể chia sẻ động các tài nguyên thực thi đó sẽ rất tuyệt vời: các luồng không bị đình trệ có được tất cả băng thông phía trước và thông lượng phía sau.
Nhưng với 8 lõi riêng biệt, khi một luồng xử lý, không có gì khác để giữ cho các đơn vị thực thi được cung cấp; các chủ đề khác không có lợi.
Việc thực thi thường bùng nổ: nó chờ đợi tải bộ nhớ cache bị mất, sau đó một khi có nhiều hướng dẫn song song có thể sử dụng kết quả đó. Với CPU siêu rộng, sự bùng nổ đó có thể diễn ra nhanh hơn và nó thực sự có thể giúp với SMT.
Nhưng chúng ta không thể có CPU siêu rộng kỳ diệu
Vì vậy, để đạt được thông lượng, thay vào đó chúng ta phải phơi bày song song với phần cứng dưới dạng song song mức luồng . Nói chung các trình biên dịch không tuyệt vời khi biết khi nào / làm thế nào để sử dụng các luồng, ngoại trừ các trường hợp đơn giản như các vòng lặp rất lớn. (OpenMP, hoặc gcc's -ftree-parallelize-loops
). Vẫn cần sự thông minh của con người để làm lại mã để có hiệu quả thực hiện song song các công việc hữu ích, bởi vì giao tiếp giữa các luồng rất tốn kém, và khởi động luồng cũng vậy.
TLP là song song hạt thô, không giống như ILP hạt mịn trong một luồng thực thi duy nhất mà CTNH có thể khai thác.
CPU nhắm vào khối lượng công việc tương tác (như Intel / AMD x86 và lõi cao cấp Apple / ARM AArch64) chắc chắn đẩy vào lợi nhuận giảm dần của quy mô IPC, bởi vì hiệu năng đơn luồng vẫn rất có giá trị khi độ trễ, không chỉ là thông lượng cho vấn đề ồ ạt song song.
Có thể chạy song song 8 bản sao của trò chơi với tốc độ 15 khung hình / giây, ít có giá trị hơn nhiều so với khả năng chạy một bản sao ở tốc độ 45 khung hình / giây. Các nhà cung cấp CPU biết điều này và đó là lý do tại sao các CPU hiện đại sử dụng thực thi không theo thứ tự mặc dù nó tiêu tốn năng lượng và diện tích đáng kể. (Nhưng GPU thì không vì khối lượng công việc của chúng đã song song lớn).
Phần cứng Xeon Phi nhiều lõi của Intel (Hiệp sĩ hạ cánh / Hiệp sĩ của Hiệp sĩ) là một điểm nửa thú vị: thực thi không theo thứ tự rất hạn chế và SMT để giữ các lõi 2 chiều được cung cấp với các hướng dẫn SIMD AVX512 để xử lý số. Các lõi dựa trên kiến trúc Silvermont năng lượng thấp của Intel. (Người thực hiện không theo thứ tự nhưng với một cửa sổ sắp xếp lại nhỏ, nhỏ hơn nhiều so với gia đình Sandybridge lõi lớn. Và một đường ống hẹp hơn.)
BTW, tất cả điều này là trực giao với SIMD. Hoàn thành nhiều công việc hơn theo hướng dẫn luôn có ích, nếu có thể cho vấn đề của bạn.
Mô hình định giá
Các mô hình định giá phần mềm được xác định dựa trên bối cảnh hiện tại của phần cứng.
Các mô hình cấp phép mỗi lõi trở nên phổ biến hơn (và có liên quan ngay cả với máy tính để bàn một ổ cắm) với sự ra đời của CPU đa lõi. Trước đó, nó chỉ liên quan đến máy chủ và máy trạm lớn.
Nếu phần mềm không cần nhiều lõi để chạy ở tốc độ cao nhất, thì thực sự sẽ không có cách nào bán rẻ hơn cho những người không nhận được nhiều lợi ích từ nó vì họ chạy nó trên CPU yếu hơn. Trừ khi có thể hệ sinh thái phần mềm / phần cứng đã phát triển các điều khiển trên "kênh SMT" cho phép bạn định cấu hình độ rộng thực thi tối đa cho mã chạy trên lõi logic đó. (Một lần nữa tưởng tượng một thế giới nơi CPU có quy mô theo chiều rộng đường ống thay vì nhiều lõi riêng biệt.)