đa CPU, đa lõi và siêu luồng


80

Có ai có thể giới thiệu cho tôi một số tài liệu để minh họa sự khác nhau giữa đa CPU, đa lõi và siêu luồng không? Tôi luôn bối rối về những khác biệt này và về ưu / nhược điểm của từng kiến ​​trúc trong các tình huống khác nhau.

CHỈNH SỬA: đây là hiểu biết hiện tại của tôi sau khi tìm hiểu trên mạng và học từ nhận xét của người khác; bất cứ ai có thể xem xét bình luận xin vui lòng?

  1. Tôi nghĩ rằng siêu phân luồng là công nghệ kém nhất trong số đó, nhưng rẻ. Ý tưởng chính của nó là các thanh ghi trùng lặp để tiết kiệm thời gian chuyển đổi ngữ cảnh;
  2. Đa bộ xử lý tốt hơn siêu phân luồng, nhưng vì các CPU khác nhau nằm trên các chip khác nhau, giao tiếp giữa các CPU khác nhau có độ trễ lâu hơn đa lõi và sử dụng nhiều chip, sẽ có nhiều chi phí và tiêu thụ điện năng hơn so với đa lõi. ;
  3. đa lõi tích hợp tất cả các CPU trên một chip duy nhất, do đó độ trễ của giao tiếp giữa các CPU khác nhau được giảm đáng kể so với đa xử lý. Vì nó sử dụng một chip duy nhất để chứa tất cả các CPU, nó tiêu thụ ít năng lượng hơn và ít tốn kém hơn so với một hệ thống nhiều bộ xử lý.

cảm ơn trước, George


Siêu phân luồng không hề kém cạnh. Nó khá hữu ích, đặc biệt cho các máy chủ. Có lợi nhuận giảm dần từ ILP (giữ cho bộ xử lý bận rộn bằng cách sắp xếp lại các lệnh tuần tự). Siêu phân luồng là một giải pháp thay thế để tăng cường tính song song: nhiều luồng phần cứng thực thi mà không tốn nhiều chi phí.
amit

Còn những điểm khác của tôi về đa lõi và đa xử lý, bạn có nghĩ rằng điểm của tôi đúng không? Có gì sai không?
George

1
@ George2 - Bản chỉnh sửa của bạn rất đúng. Đó là toàn bộ ý tưởng. :) Điều tốt nhất bạn có thể nhận được trên một máy chủ có lẽ là đa CPU đa lõi, nhưng đối với cách sử dụng thông thường thì đa lõi là cách tốt nhất!
Bogdan Constantinescu

Cảm ơn Bogdan, với xác nhận của bạn, tôi tự tin hơn! :-)
George

Đó là một mô tả khủng khiếp về siêu phân luồng. Điểm chính là từ bỏ một số hiệu suất trên mỗi luồng để đạt được tổng thông lượng cao hơn, chỉ với một chút phần cứng bổ sung ở mặt trước của lõi không theo thứ tự. Xem phần Hỏi & Đáp này hỏi về một đoạn tương tự trong câu trả lời được chấp nhận (trước khi chỉnh sửa của tôi đã sửa nó).
Peter Cordes

Câu trả lời:


86

Đa CPU là phiên bản đầu tiên: Bạn sẽ có một hoặc nhiều bo mạch chủ với một hoặc nhiều chip CPU trên chúng. Vấn đề chính ở đây là các CPU sẽ phải tiết lộ một số dữ liệu bên trong của chúng cho CPU khác để chúng không cản trở chúng.

Bước tiếp theo là siêu phân luồng. Một con chip trên mainboard nhưng nó có một số bộ phận nằm bên trong hai lần nên nó có thể thực hiện hai lệnh cùng một lúc.

Sự phát triển hiện tại là đa lõi. Về cơ bản, đó là ý tưởng ban đầu (một số CPU hoàn chỉnh) nhưng trong một con chip duy nhất. Ưu điểm: Các nhà thiết kế chip có thể dễ dàng đặt các dây bổ sung cho các tín hiệu đồng bộ vào chip (thay vì phải định tuyến chúng ra trên một chân, sau đó qua mainboard đông đúc và lên thành chip thứ hai).

Siêu máy tính ngày nay đa nhân, đa nhân: Chúng có rất nhiều bo mạch chủ với thường là 2-4 CPU trên đó, mỗi CPU là đa nhân và mỗi nhân đều có RAM riêng.

[EDIT] Bạn đã hiểu khá đúng. Chỉ là một số điểm nhỏ:

  • Siêu phân luồng theo dõi hai bối cảnh cùng một lúc trong một lõi đơn, cho thấy sự song song hơn với lõi CPU không theo thứ tự. Điều này giữ cho các đơn vị thực thi được tiếp tục hoạt động, ngay cả khi một luồng bị đình trệ do bỏ lỡ bộ nhớ cache, dự đoán sai nhánh hoặc chờ kết quả từ các hướng dẫn có độ trễ cao. Đó là một cách để có được tổng thông lượng nhiều hơn mà không cần tái tạo nhiều phần cứng, nhưng nếu có bất kỳ điều gì, nó sẽ làm chậm từng luồng riêng lẻ. Xem phần Hỏi & Đáp này để biết thêm chi tiết và giải thích về điều sai với cách diễn đạt trước đó của đoạn này.

  • Vấn đề chính với đa CPU là mã chạy trên chúng cuối cùng sẽ truy cập vào RAM. Có N CPU nhưng chỉ có một bus để truy cập RAM. Vì vậy, bạn phải có một số phần cứng đảm bảo rằng a) mỗi CPU nhận được một lượng truy cập RAM hợp lý, b) việc truy cập vào cùng một phần của RAM không gây ra sự cố và c) quan trọng nhất là CPU 2 sẽ được thông báo khi CPU 1 ghi vào địa chỉ bộ nhớ nào đó mà CPU 2 có trong bộ nhớ đệm bên trong của nó. Nếu điều đó không xảy ra, CPU 2 sẽ vui vẻ sử dụng giá trị được lưu trong bộ nhớ cache, không biết rằng nó đã lỗi thời

    Chỉ cần tưởng tượng bạn có các nhiệm vụ trong một danh sách và bạn muốn chia chúng cho tất cả các CPU có sẵn. Vì vậy, CPU 1 sẽ lấy phần tử đầu tiên từ danh sách và cập nhật các con trỏ. CPU 2 cũng sẽ làm như vậy. Vì lý do hiệu quả, cả hai CPU sẽ không chỉ sao chép một vài byte vào bộ nhớ cache mà là toàn bộ "dòng bộ nhớ cache" (bất cứ điều gì có thể là). Giả định rằng, khi bạn đọc byte X, bạn cũng sẽ sớm đọc X + 1.

    Bây giờ cả hai CPU đều có một bản sao của bộ nhớ trong bộ nhớ đệm của chúng. CPU 1 sau đó sẽ tìm nạp mục tiếp theo từ danh sách. Nếu không có đồng bộ hóa bộ nhớ cache, nó sẽ không nhận thấy rằng CPU 2 cũng đã thay đổi danh sách và nó sẽ bắt đầu hoạt động trên cùng một mục như CPU ​​2.

    Đây là những gì hiệu quả làm cho đa CPU trở nên phức tạp. Tác dụng phụ của điều này có thể dẫn đến hiệu suất kém hơn những gì bạn nhận được nếu toàn bộ mã chỉ chạy trên một CPU duy nhất. Giải pháp là đa lõi: Bạn có thể dễ dàng thêm nhiều dây nếu bạn cần để đồng bộ hóa bộ nhớ đệm; bạn thậm chí có thể sao chép dữ liệu từ bộ đệm này sang bộ đệm khác (cập nhật các phần của dòng bộ đệm mà không cần phải xóa và tải lại), v.v. Hoặc logic bộ đệm có thể đảm bảo rằng tất cả các CPU đều nhận được cùng một dòng bộ nhớ cache khi chúng truy cập vào cùng một phần của RAM thực, chỉ cần chặn CPU 2 trong vài nano giây cho đến khi CPU 1 thực hiện các thay đổi.

[EDIT2] Lý do chính tại sao đa lõi đơn giản hơn đa CPU là trên bo mạch chủ, bạn không thể chạy tất cả các dây giữa hai chip mà bạn cần để đồng bộ hóa hiệu quả. Thêm vào đó, một tín hiệu chỉ truyền tới đỉnh 30cm / ns (tốc độ ánh sáng; trong một dây, bạn thường có ít hơn nhiều). Và đừng quên rằng, trên một mainboard nhiều lớp, các tín hiệu bắt đầu ảnh hưởng lẫn nhau (nhiễu xuyên âm). Chúng tôi thích nghĩ rằng 0 là 0V và 1 là 5V nhưng trên thực tế, "0" là một cái gì đó giữa -0,5V (tăng tốc khi giảm một dòng từ 1-> 0) và 0,5V và "1" là bất kỳ thứ gì trên 0,8V.

Nếu bạn có mọi thứ bên trong một con chip duy nhất, tín hiệu sẽ chạy nhanh hơn nhiều và bạn có thể có bao nhiêu tùy thích (tốt, gần như vậy :). Ngoài ra, tín hiệu nhiễu xuyên âm dễ kiểm soát hơn nhiều.


3
Khái niệm siêu phân luồng của bạn có thể hơi sai lệch, vì siêu phân luồng "chỉ" mô phỏng việc thực thi song song nhiều luồng - nhưng chủ yếu cố gắng cải thiện hiệu suất đa luồng bằng logic CPU tích hợp.
JC Inacio

@jcinacio, siêu phân luồng có cải thiện hiệu suất đa quy trình không? Tại sao?
George

@Aaron, 1. Tôi đã chỉnh sửa điểm hiện tại của mình trong bài đăng gốc sau khi học hỏi từ bạn. Bạn có thể giúp xem xét và cho ý kiến ​​được không? 2. Điều gì có nghĩa là "để lộ một số dữ liệu nội bộ của họ với CPU khác để chúng không cản đường họ." trong bài viết của bạn?
George

@Aaron, câu trả lời của bạn quá xuất sắc, câu hỏi cuối cùng của tôi, tại sao bạn nói CPU đa lõi giải quyết được vấn đề đồng bộ hóa trạng thái CPU / chờ vấn đề RAM? Tôi nghĩ nếu lôgic mã giống nhau, sự cố đồng bộ hóa và chờ RAM vẫn tồn tại. Có ý kiến ​​gì không?
George

1
@AmitP xin lưu ý rằng các câu hỏi quá rộng thường có xu hướng bị bỏ phiếu và đóng ở Lập trình viên, hãy xem Điều gì xảy ra với Lập trình viên.SE? Hướng dẫn cho Tràn ngăn xếp
gnat

4

Bạn có thể tìm thấy một số bài viết thú vị về CPU kép, đa lõi và siêu phân luồng trên trang web của Intel hoặc trong một bài báo ngắn của Đại học Yale .

Tôi hy vọng bạn tìm thấy ở đây tất cả các thông tin bạn cần.


Bogdan, tôi đã chỉnh sửa điểm hiện tại của mình trong bài đăng gốc của mình. Bạn có thể giúp xem xét và cho ý kiến ​​được không? Tôi đã học chúng sau khi đọc các liên kết được đề xuất của bạn
George

@ George2 - Bản chỉnh sửa của bạn rất đúng. Đó là toàn bộ ý tưởng. :) Điều tốt nhất bạn có thể nhận được trên một máy chủ có lẽ là một đa lõi đa CPU
Bogdan Constantinescu

2
Cả hai liên kết bị phá vỡ :(
rkachach

2

Tóm lại: hệ thống đa CPU hoặc nhiều bộ xử lý có một số bộ xử lý. Hệ thống đa lõi là một hệ thống đa bộ xử lý với một số bộ xử lý trên cùng một khuôn. Trong siêu phân luồng, nhiều luồng có thể chạy trên cùng một bộ xử lý (đó là thời gian chuyển đổi ngữ cảnh giữa nhiều luồng này là rất nhỏ).

Đa bộ xử lý đã tồn tại 30 năm nay nhưng chủ yếu là trong các phòng thí nghiệm. Đa lõi là bộ xử lý đa nhân phổ biến mới. Bộ xử lý máy chủ ngày nay thực hiện siêu phân luồng cùng với đa bộ xử lý.

Các bài viết trên wikipedia về các chủ đề này khá minh họa.


Amit, 1. Tôi đã chỉnh sửa điểm hiện tại của mình trong bài đăng gốc sau khi học hỏi từ bạn. Bạn có thể giúp xem xét và cho ý kiến ​​được không? 2. Chết và xé trong bài viết của bạn có nghĩa là gì?
George
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.