Làm thế nào một CPU có thể cung cấp nhiều hơn một lệnh trong mỗi chu kỳ?


41

Hướng dẫn của Wikipedia trên mỗi trang thứ hai nói rằng i7 3630QM cung cấp ~ 110.000 MIPS với tần số 3,2 GHz; nó sẽ là (110 / 3.2 hướng dẫn) / 4 lõi = ~ 8,6 hướng dẫn trên mỗi chu kỳ trên mỗi lõi?! Làm thế nào một lõi đơn có thể cung cấp nhiều hơn một lệnh trong mỗi chu kỳ?

Theo hiểu biết của tôi, một đường ống chỉ có thể cung cấp một kết quả cho mỗi đồng hồ.

Đây là những suy nghĩ của tôi:

  • Tần số nội bộ thực sự cao hơn 3,2 GHz
  • Một số phần của CPU không đồng bộ theo cách mà một người khiêm tốn như tôi không thể hiểu được
  • Có nhiều đường ống đồng thời trên mỗi lõi
  • Một đường ống có thể cung cấp nhiều hơn kết quả trên mỗi đồng hồ, một hướng dẫn có thể bỏ qua các giai đoạn đường ống và có nhiều trình nạp trước để theo kịp
  • Tôi đang thiếu một cái gì đó

1
Nó cung cấp 110.000 DhIPSone MIPS, vì vậy DMIPS, không phải MIPS, là thứ tôi nhìn thấy trực tiếp - có lẽ điều này có thể tạo ra sự khác biệt? Xem en.wikipedia.org/wiki/Dhstallone

Câu trả lời:


44

Thứ nhất, như bình luận Keelan củacâu trả lời Turbo J điểm ra, việc đo lường là 113.093 Dhrystone MIPS không có nguồn gốc MIPS.

Kiến trúc vi mô cầu Ivy của i7 3630QM chỉ có thể cam kết 4 bản nhạc được hợp nhất trong mỗi chu kỳ, mặc dù nó có thể bắt đầu thực hiện 6 bản nhạc trên mỗi chu kỳ. (Số lượng μops hợp nhất trong một dấu vết của mã là xấp xỉ bằng với số hướng dẫn, một số hướng dẫn phức tạp được giải mã thành nhiều μops không được hợp nhất và một số cặp hướng dẫn có thể được hợp nhất thành một μop duy nhất, ví dụ như, một so sánh ngay lập tức theo sau là một bước nhảy có điều kiện.)

Hai trong số những suy đoán của bạn về cách thực hiện nhiều hướng dẫn trong một chu kỳ duy nhất là khá hợp lệ và đã được sử dụng trong các bộ xử lý thực tế. Suy đoán đầu tiên của bạn, rằng đồng hồ bên trong nhanh hơn được sử dụng, đã được sử dụng trong ALU "quả cầu lửa" ban đầu của Pentium 4. Các ALU này được đo ở tần số gấp đôi tần số của phần còn lại của lõi, vốn đã tương đối cao.

(Điều này đã được thực hiện bằng cách sử dụng ALU so le trong đó nửa dưới của phép cộng được thực hiện trong một chu kỳ, cho phép thao tác phụ thuộc sử dụng nửa dưới của kết quả trong chu kỳ tiếp theo. Đối với các hoạt động như thêm, xor hoặc dịch chuyển trái chỉ cần nửa dưới của toán hạng để tạo ra nửa dưới của kết quả, thì điều đáng kinh ngạc đó còn được gọi là đường ống rộng cho phép độ trễ kết quả chu kỳ đơn cũng như thông lượng chu kỳ đơn.)

Một kỹ thuật có liên quan, ALU xếp tầng, được HyperSPARC sử dụng. HyperSPARC đã đưa kết quả từ hai ALU vào ALU thứ ba. Điều này cho phép hai hoạt động phụ thuộc độc lập và thứ ba được thực hiện trong một chu kỳ.

Suy đoán của bạn rằng "có nhiều đường ống đồng thời trên mỗi lõi" là kỹ thuật khác đã được sử dụng. Kiểu thiết kế này được gọi là superscalar và cho đến nay là phương tiện phổ biến nhất để tăng số lượng hoạt động được thực hiện trong một chu kỳ.

Ngoài ra còn có một vài tỷ lệ cược và kết thúc thực hiện lệnh khác có thể đáng chú ý. Một số hoạt động có thể được thực hiện hiệu quả hơn bên ngoài các đơn vị thực thi thông thường. Kỹ thuật loại bỏ di chuyển khai thác việc sử dụng đổi tên đăng ký trong các bộ xử lý không theo thứ tự để thực hiện các hoạt động di chuyển trong khi đổi tên đăng ký; di chuyển chỉ cần sao chép số đăng ký vật lý từ một vị trí trong bảng đổi tên (được gọi là bảng bí danh đăng ký) sang vị trí khác. Điều này không chỉ làm tăng hiệu quả chiều rộng thực hiện mà còn loại bỏ sự phụ thuộc. Kỹ thuật này đã được sử dụng sớm với x87 dựa trên ngăn xếp, nhưng hiện được sử dụng rộng rãi trong các bộ xử lý x86 hiệu suất cao của Intel. (Việc sử dụng các hướng dẫn phá hủy, hai toán hạng trong x86 làm cho việc loại bỏ di chuyển trở nên hữu ích hơn so với trong RISC điển hình.)

Một kỹ thuật tương tự như loại bỏ di chuyển là xử lý các hướng dẫn zeroing đăng ký trong khi đổi tên. Bằng cách cung cấp tên thanh ghi cung cấp giá trị 0, một lệnh xóa thanh ghi (như xor hoặc trừ với cả hai toán hạng là cùng một thanh ghi) có thể chỉ cần chèn tên đó vào bảng đổi tên (RAT).

Một kỹ thuật khác được sử dụng bởi một số bộ xử lý x86 giúp giảm chi phí cho các hoạt động đẩy và pop. Thông thường, một lệnh sử dụng con trỏ ngăn xếp sẽ phải đợi một chu kỳ đầy đủ cho lần đẩy hoặc bật trước đó để cập nhật giá trị cho con trỏ ngăn xếp. Bằng cách nhận ra rằng đẩy và bật chỉ cộng hoặc trừ một giá trị nhỏ cho con trỏ ngăn xếp, người ta có thể tính toán kết quả của nhiều phép cộng / phép trừ song song. Độ trễ chính cho phép cộng là lan truyền mang, nhưng với các giá trị nhỏ, các bit quan trọng hơn của giá trị cơ sở, trong trường hợp này, con trỏ ngăn xếp sẽ chỉ có tối đa một lần mang. Điều này cho phép tối ưu hóa tương tự như trình bổ sung chọn mang theo được áp dụng cho nhiều lần thêm các giá trị nhỏ. Ngoài ra, vì con trỏ ngăn xếp thường chỉ được cập nhật bởi các hằng số,

Cũng có thể hợp nhất các hướng dẫn thành một hoạt động phức tạp hơn. Mặc dù quá trình phân tách ngược các hướng dẫn thành nhiều thao tác đơn giản hơn là một kỹ thuật cũ, các hướng dẫn hợp nhất (mà Intel thuật ngữ hợp nhất macro-op) có thể cho phép thực hiện để hỗ trợ các hoạt động phức tạp hơn các thao tác được trình bày trong tập lệnh.

Về mặt lý thuyết, các kỹ thuật khác đã được đề xuất. Các hằng số nhỏ khác 0 có thể được hỗ trợ trong RAT và một số thao tác đơn giản sử dụng hoặc tạo ra các giá trị nhỏ như vậy có thể được xử lý sớm. ("Nội dung đăng ký vật lý", Mikko H. Lipasti và cộng sự, 2004, đã đề xuất sử dụng RAT như một phương tiện để giảm số lượng đăng ký, nhưng ý tưởng có thể được mở rộng để hỗ trợ tải số lượng nhỏ và các thao tác đơn giản trên số lượng nhỏ.)

Đối với bộ đệm theo dõi (lưu trữ các chuỗi hướng dẫn theo các giả định cụ thể của luồng điều khiển), có thể có cơ hội hợp nhất các hoạt động được phân tách bởi các nhánh và loại bỏ các hoạt động tạo ra kết quả không sử dụng trong theo dõi. Bộ nhớ đệm của các tối ưu hóa trong bộ đệm theo dõi cũng có thể khuyến khích thực hiện tối ưu hóa như hợp nhất lệnh có thể không đáng nếu chúng phải được thực hiện mỗi khi luồng lệnh được tìm nạp.

Dự đoán giá trị có thể được sử dụng để tăng số lượng các hoạt động có thể được thực hiện song song bằng cách loại bỏ các phụ thuộc. Công cụ dự đoán giá trị dựa trên bước tiến tương tự như tối ưu hóa pop / đẩy của một công cụ ngăn xếp chuyên dụng đã đề cập trước đó. Nó có thể tính toán nhiều bổ sung chủ yếu song song, loại bỏ việc xê-ri hóa. Ý tưởng chung về dự đoán giá trị là với giá trị dự đoán, các hoạt động phụ thuộc có thể tiến hành không chậm trễ. .


tuyệt vời! Cảm ơn bạn đã thông tin có giá trị. Bạn có thể gợi ý một cuốn sách mà tôi có thể đọc tất cả các kỹ thuật kiến ​​trúc này không?
không có việc làm

@workless Một khi bạn vượt ra khỏi những điều cơ bản về thực thi siêu đường ống và không theo thứ tự (sẽ được bao phủ bởi hầu hết các sách giáo khoa kiến ​​trúc máy tính), các nguồn thông tin tốt nhất có thể là mô tả về các vi kiến ​​trúc bộ xử lý cụ thể (như bài viết trên Haswell được liên kết trong câu trả lời của gnasher729 ) và các bài báo học thuật (ISCA và MICRO [hội nghị] thường có các bài viết hay; HPCA, PACT, ASPLOS, và có lẽ một vài người khác cũng có danh tiếng tốt). Andy Glew (có lẽ nổi tiếng nhất với tác phẩm về Pentium Pro) ...
Paul A. Clayton

1
... đã làm việc trên wiki CompArch, trình bày các khái niệm nâng cao hơn, nhưng tiến độ rất chậm và rõ ràng nó đã bị hack cách đây một thời gian và vì vậy bây giờ chỉ đưa ra một thông báo lỗi ( semipublic.comp-arch.net/wiki ). Anh ta dự định khôi phục wiki (văn bản gốc đã được bảo tồn) bằng các phần mềm wiki khác nhau (anh ta có một số vấn đề với phần mềm anh ta đang sử dụng và coi đây là cơ hội để cải thiện), nhưng "Sẽ còn lâu nữa."
Paul A. Clayton

Một ví dụ điển hình cho sự thành công của kiến ​​trúc siêu khối là HyperThreading của Intel - với tất cả những tối ưu hóa đó, các kỹ sư của Intel đã phát hiện ra rằng khoảng 30% ALU không được sử dụng hầu hết thời gian, bởi vì bộ nhớ không thể lưu chuyển đủ nhanh, hoặc đường ống không thể được lấp đầy đủ hiệu quả. HyperThreading cho phép bạn có được rất nhiều công việc miễn phí trong kịch bản lý tưởng. Nó ít hơn nhiều so với việc có một lõi mới riêng biệt, nhưng nó cũng rẻ hơn nhiều (và nó cũng có thể được kết hợp với đa lõi).
Luaan

@ PaulA.Clayton - hai hình chụp của trang đó trên Wayback. Ngày 20 tháng 12 năm 2013ngày 14 tháng 2 năm 2014 . Tôi không biết nếu những ảnh chụp đó có trước các vấn đề với trang. Thật không may, khi tôi cố gắng truy cập các trang đó trên Wayback, tôi đã nhận được thông báo " Bummer. Máy phục vụ tệp này bị hỏng. Chúng tôi đang làm việc với nó. ", Vì vậy tôi không chắc có thể nhìn thấy gì trên các trang đó .
Kevin Fegan

10

Một số phép thuật đen tối xảy ra ở bên trong các bộ xử lý hiện đại, nhưng suy nghĩ của bạn chắc chắn là đi đúng hướng.

Chìa khóa để hiểu được hiệu quả của các bộ xử lý hiện đại là nhận ra rằng chúng là siêu khối . Từ Wikipedia (nhấn mạnh của tôi):

Một kiến ​​trúc CPU siêu khối thực hiện một dạng song song được gọi là song song mức lệnh trong một bộ xử lý. Do đó, nó cho phép thông lượng CPU nhanh hơn so với tốc độ xung nhịp nhất định.

Những bộ xử lý hiện đại này có nhiều đơn vị thực thi trên mỗi lõi, như bạn đoán. Siêu phân luồng rất thú vị để xem xét, một số phần của đường ống được nhân đôi nhưng một số thì không.

Thực hiện không theo thứ tự cũng thú vị để đọc về, nhưng không trả lời trực tiếp câu hỏi của bạn. Nó làm giảm số lượng chu kỳ CPU "lãng phí" mặc dù.

Hiệu quả cũng bị ảnh hưởng bởi nhiều thứ khác có thể gây ra sự cố trong bộ xử lý, bao gồm (nhưng chắc chắn không giới hạn):

  • Kết quả của các hướng dẫn trước đây không có sẵn.
  • Bộ nhớ cache bị mất.
  • Việc phân nhánh mã, sẽ làm mất hiệu lực các hướng dẫn đã tìm nạp (đọc về dự đoán chi nhánh ở đâyđây ).

Trình biên dịch hiện đại cố gắng giúp với nhiều mục trên, bộ xử lý sẽ tiếp quản. Để có một ví dụ tốt, hãy xem câu hỏi này ở nơi khác trên Stackexchange, trong đó nêu bật một sự khác biệt quan trọng giữa hai hướng dẫn có thể làm điều tương tự (trong một số trường hợp). Tuy nhiên, một cái có thể "nhanh hơn" so với cái khác trên một số bộ xử lý do đơn vị thực thi đang sử dụng.

Để biết giải thích có thể đọc được của con người về đường ống CPU hiện đại, hãy xem Hành trình qua đường ống CPU . Để được giải thích kỹ thuật hơn, hãy xem bài viết về Kiến trúc vi mô của Agner Fog .


cảm ơn bạn đã giải thích và các liên kết rất thú vị. Như một lưu ý, Cell trông rất thú vị, tôi mong muốn nghiên cứu thêm về kiến ​​trúc cpu ^ _ ^. "" X86 sử dụng "siêu tuyến" như mô tả ở trên. Gia đình Cell sử dụng cách tiếp cận "hiệp đồng" liên quan đến chín mini-cpus. Đúng là mỗi cpu mini đi theo một đường ống hầu hết theo thứ tự, mini-cpus có nhiều đường ống siêu thanh song song chứ không phải là một đường ống duy nhất. ""
không hoạt động vào

3

Bạn nghĩ điều gì đã xảy ra: Tất cả các kỹ sư của Intel, AMD và IBM đều đọc rằng một đường ống chỉ có thể cung cấp một kết quả cho mỗi chu kỳ và họ nói "ồ, vậy thì, không thể làm cho các bộ xử lý này nhanh hơn". Hoặc họ đã đọc điều này và nói: "Không thể cung cấp nhiều hơn một kết quả cho mỗi chu kỳ? Chúng tôi sẽ xem về điều đó!".

Để có phần giới thiệu tốt về kiến ​​trúc Haswell, ví dụ, bạn có thể theo liên kết này http://www.realworldtech.com/haswell-cpu/ hoặc bạn chỉ cần truy cập trang web của Intel và bạn sẽ tìm thấy một chút tài liệu ở đó.

Mỗi lõi của bộ xử lý Haswell có một số lượng lớn các đơn vị thực thi, có thể thực hiện các hoạt động độc lập với nhau, do đó nhiều hoạt động có thể được thực hiện song song. Tiếp theo, bộ xử lý Haswell có một số đơn vị thực thi xử lý các hoạt động vectơ có kích thước lên tới 256 bit. Ví dụ, một phép toán vectơ có thể thực hiện bốn phép toán dấu phẩy động chính xác kép hoặc tám phép toán dấu phẩy động chính xác đơn trong một phép toán vectơ. Và cuối cùng, bộ xử lý Haswell hỗ trợ "cộng bội nhân", điều đó có nghĩa là việc tính toán một lần b cộng với c chỉ là một thao tác duy nhất.

Tối đa về mặt lý thuyết, vì Haswell có hai đơn vị có khả năng hợp nhất đa bội, là hai phép toán nhân bội cộng trong mỗi chu kỳ, mỗi phép toán thực hiện tám phép nhân chính xác đơn cộng với phép cộng hoặc 32 phép toán dấu phẩy động chính xác đơn.

Bộ xử lý 3630 không nằm trong bảng giá mới nhất của Intel, nhưng có những model như 3740QM với bốn lõi. Vì vậy, thay vì 32, bạn có thể nhận được 128 thao tác dấu phẩy động trên mỗi chu kỳ đồng hồ. Đây là tối đa lý thuyết. Đạt được một nửa số đó trong cuộc sống thực là một thách thức, nhưng không phải là không thể đối với các nhiệm vụ phù hợp. Có những bộ xử lý khác có sẵn với tối đa 15 lõi (với mức giá mà ngay cả những người cuồng tín chơi game nhất cũng không phải trả).

Vì vậy, bạn có một sự kết hợp của nhiều số nhân:

  1. Nhiều lõi cho mỗi bộ xử lý.
  2. (Siêu phân luồng, không được đề cập trước đây, cho phép bạn tiến gần hơn đến giới hạn lý thuyết)
  3. Hoạt động nhân thêm cộng được thực hiện hai hoạt động số học chỉ tính là một.
  4. Các vectơ 256 bit thực hiện 8 thao tác chỉ được tính là một.
  5. Hai đơn vị thực hiện véc tơ có khả năng xử lý cộng gộp.

8,6 hoạt động trên mỗi chu kỳ không quá khó để đạt được. Ngay cả 8,6 hoạt động trên mỗi chu kỳ trên mỗi lõi không quá khó.


Tôi tự hỏi liệu sẽ là thực tế hay thuận lợi khi thiết kế CPU với một số lõi chạy x86 và một số chạy một tập lệnh được tối ưu hóa cho hành vi siêu phẳng. Tôi biết Intel và AMD thực hiện một số điều khá tuyệt vời để khắc phục những hạn chế trong tập lệnh x86, nhưng trong một số trường hợp tôi sẽ nghĩ rằng việc biết một số điều mà tập lệnh hiện tại không thể diễn đạt sẽ hữu ích. Ví dụ: các phiên bản ADDhướng dẫn riêng biệt dựa trên việc liệu có nên để không bị ảnh hưởng hay không nên được đặt khi tràn xảy ra (và đặt bên trái nếu không).
supercat

1
Tôi thấy buồn vì thời đại ngày nay, nhiều ngôn ngữ mặc định không kiểm tra tràn. Tôi biết rằng Java bị mắc kẹt khá nhiều bởi các yêu cầu ngữ nghĩa, nhưng trong các ngôn ngữ như C # bao gồm cả toán tử số học bẫy và không bẫy, lý do chính đáng duy nhất tôi thấy không để bẫy tràn là vì một hành vi cần gói. Hiện tại, kiểm tra tràn có thể áp dụng một hình phạt tốc độ đáng kể, nhưng nếu một ngôn ngữ máy được thiết kế xung quanh ý tưởng rằng bẫy tràn không cần chính xác miễn là mã có thể đảm bảo rằng không có tràn xảy ra trước khi vận hành ...
supercat

... đạt đến một số điểm quan trọng nhất định, có thể giảm chi phí bẫy tràn xuống gần như bằng không. Nếu mã thực hiện tính toán và sau đó lưu giá trị vào một vị trí sẽ bị bỏ qua nếu phép tính đầu tiên tràn ra, không cần phải trì hoãn lưu trữ cho đến khi bộ xử lý biết liệu phép tính đầu tiên có thành công hay không, nhưng hiện tại bộ xử lý không có cách nào biết điều đó Nếu mã chỉ đơn giản có thể thực hiện tất cả các hoạt động có thể được thực hiện một cách an toàn cho dù có xảy ra tràn hay không, và sau đó kiểm tra xem có xảy ra tràn không đúng cách trên bất kỳ trong số chúng không ...
supercat

... có vẻ như nó sẽ giúp giảm bớt sự phụ thuộc thực thi.
supercat

2

Điểm chuẩn Dstallone là từ năm 1984 và máy VAX 1 MIPS danh nghĩa tương ứng không hiệu quả lắm về mặt hiện đại. Ngay cả một Cortex M3 cũng cung cấp 1,25 DMPIS / MHz.

Bộ xử lý Intel Core ach architecture thực sự có thể chạy song song nhiều hướng dẫn trong một lõi, bởi vì có nhiều đơn vị tính toán hiện diện.


1

Tôi đã học được rất nhiều từ Jon "Hannibal" của Ars Technica Stokes những bài viết xuất sắc và phong phú về chủ đề kiến ​​trúc vi xử lý. Các bài viết có một ít ngày (chúng dường như là từ khoảng năm 2004), nhưng vẫn còn rất phù hợp.

Một số liên kết đến phần tiếp theo của bài viết đã bị hỏng, tuy nhiên có vẻ như bạn có thể tự sửa chúng bằng cách so sánh cẩn thận URL của phần đầu tiên và URL bị hỏng của trang tiếp theo (ví dụ: thêm một nơi m-nào đó vào URL).

(vâng, đây là một câu trả lời chỉ liên kết được tôn vinh, xin lỗi; các bài viết quá hay để không đề cập đến chúng)

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.