Làm thế nào để một chủ đề duy nhất chạy trên nhiều lõi?


61

Tôi đang cố gắng để hiểu, ở cấp độ cao, cách các luồng đơn chạy trên nhiều lõi. Dưới đây là sự hiểu biết tốt nhất của tôi. Tôi không tin đó là chính xác mặc dù.

Dựa trên việc tôi đọc Hyper-threading , có vẻ như HĐH tổ chức các hướng dẫn của tất cả các luồng theo cách mà chúng không chờ đợi nhau. Sau đó, mặt trước của CPU tổ chức thêm các hướng dẫn đó bằng cách phân phối một luồng cho mỗi lõi và phân phối các lệnh độc lập từ mỗi luồng trong bất kỳ chu kỳ mở nào.

Vì vậy, nếu chỉ có một luồng duy nhất, thì HĐH sẽ không thực hiện bất kỳ tối ưu hóa nào. Tuy nhiên, mặt trước của CPU sẽ phân phối các tập lệnh độc lập giữa mỗi lõi.

Theo https://stackoverflow.com/a/15936270 , một ngôn ngữ lập trình cụ thể có thể tạo ra nhiều hoặc ít luồng, nhưng nó không liên quan khi xác định phải làm gì với các luồng đó. HĐH và CPU xử lý việc này, vì vậy điều này xảy ra bất kể ngôn ngữ lập trình được sử dụng.

nhập mô tả hình ảnh ở đây

Để làm rõ, tôi đang hỏi về một luồng duy nhất chạy trên nhiều lõi, không phải về việc chạy nhiều luồng trên một lõi.

Tóm tắt của tôi là gì? Các hướng dẫn của một luồng được phân chia giữa nhiều lõi như thế nào và ở đâu? Liệu ngôn ngữ lập trình có vấn đề? Tôi biết đây là một chủ đề rộng; Tôi hy vọng cho một sự hiểu biết cấp cao về nó.


6
Một bộ hướng dẫn cho một luồng phần mềm duy nhất có thể chạy trên nhiều lõi, nhưng không phải cùng một lúc.
Kroltan

1
Bạn đang trộn các luồng phần mềm (liên quan đến bộ lập lịch hệ điều hành) và các luồng phần cứng hoặc HyperThreading (một tính năng CPU làm cho một lõi hoạt động như hai).
ugoren

2
Tôi có 20 lái xe và 4 xe tải. Làm thế nào có thể một tài xế có thể cung cấp các gói với hai xe tải? Làm thế nào có thể một chiếc xe tải có thể có nhiều trình điều khiển? Câu trả lời cho cả hai câu hỏi là như nhau. Thay phiên nhau.
Eric Lippert

Câu trả lời:


84

Hệ điều hành cung cấp các lát cắt thời gian của CPU cho các luồng đủ điều kiện để chạy.

Nếu chỉ có một lõi, thì hệ điều hành sẽ lập lịch cho luồng đủ điều kiện nhất để chạy trên lõi đó trong một lát thời gian. Sau khi lát thời gian hoàn thành hoặc khi luồng xử lý chặn trên IO hoặc khi bộ xử lý bị gián đoạn bởi các sự kiện bên ngoài, hệ điều hành sẽ đánh giá lại luồng nào sẽ chạy tiếp theo (và nó có thể chọn lại cùng một luồng hoặc một luồng khác).

Đủ điều kiện để chạy bao gồm các biến thể về tính công bằng, mức độ ưu tiên và sự sẵn sàng, và bằng phương pháp này, các chủ đề khác nhau có được các lát cắt thời gian, nhiều hơn các phần khác.

Nếu có nhiều lõi, N, thì hệ điều hành sẽ lập lịch cho các luồng N đủ điều kiện nhất để chạy trên các lõi.

Ái lực của bộ xử lý là một xem xét hiệu quả. Mỗi lần CPU chạy một luồng khác so với trước, nó có xu hướng chậm lại một chút vì bộ đệm của nó ấm cho luồng trước, nhưng lại lạnh với luồng mới. Do đó, chạy cùng một luồng trên cùng một bộ xử lý trong nhiều lát cắt thời gian là một lợi thế hiệu quả.

Tuy nhiên, hệ điều hành có thể tự do cung cấp một lát thời gian luồng trên các CPU khác nhau và nó có thể xoay qua tất cả các CPU trên các lát thời gian khác nhau. Tuy nhiên, không thể, như @ gnasher729 nói , chạy cùng một luồng trên nhiều CPU.

Siêu phân luồng là một phương pháp trong phần cứng, trong đó một lõi CPU được tăng cường duy nhất có thể hỗ trợ thực hiện đồng thời hai hoặc nhiều luồng khác nhau . . cho phép chia sẻ các đơn vị chức năng trong CPU đó mà không làm xáo trộn các luồng.

Siêu phân luồng, trong khi thách thức về mặt kỹ thuật từ góc độ phần cứng, từ quan điểm của lập trình viên, mô hình thực thi chỉ đơn thuần là các lõi CPU bổ sung chứ không phải là bất cứ điều gì phức tạp hơn. Vì vậy, hệ điều hành nhìn thấy các lõi CPU bổ sung, mặc dù có một số vấn đề về mối quan hệ bộ xử lý mới vì một số luồng siêu phân luồng đang chia sẻ kiến ​​trúc bộ đệm của một lõi CPU.


Chúng ta có thể ngây thơ nghĩ rằng hai luồng chạy trên lõi siêu liên kết, mỗi luồng chạy nhanh bằng một nửa với mỗi luồng có lõi đầy đủ của riêng chúng. Nhưng điều này không nhất thiết phải như vậy, vì việc thực thi một luồng duy nhất chứa đầy chu kỳ chậm chạp và một số lượng trong số chúng có thể được sử dụng bởi luồng siêu phân luồng khác. Hơn nữa, ngay cả trong các chu kỳ không chùng, một luồng có thể đang sử dụng các đơn vị chức năng khác với các đơn vị khác để thực hiện đồng thời có thể xảy ra. CPU nâng cao cho siêu phân luồng có thể có thêm một vài đơn vị chức năng được sử dụng nhiều đặc biệt để hỗ trợ điều đó.


3
"Do đó, chạy cùng một luồng trên cùng một bộ xử lý trong nhiều lát cắt thời gian là một lợi thế hiệu quả." Nó sẽ không phải là lát cắt thời gian tiếp giáp ? Nếu không, bộ nhớ cache sẽ bị xóa bởi các chủ đề khác, phải không? +1 cho một lời giải thích tốt đẹp.
jpmc26

2
@Luaan: HT thường tốt, nhưng tình huống không đơn giản như bạn mô tả. Băng thông vấn đề mặt trước (4 uops trên mỗi đồng hồ trên Intel, 6 trên Ryzen) được chia sẻ đồng đều giữa các luồng (trừ khi một chuỗi bị đình trệ). Nếu đó là nút cổ chai, thì như tôi đã nói HT sẽ không giúp được gì cả. Không có gì lạ khi Skylake tiến gần đến vòng lặp được điều chỉnh tốt, nếu có sự pha trộn của tải, ALU và cửa hàng ... Các bóng bán dẫn rẻ tiền (và tất cả không thể chuyển đổi cùng một lúc hoặc CPU sẽ tan chảy), vì vậy CPU x86 hiện đại có nhiều cổng thực thi hơn so với giao diện người dùng có thể cung cấp (với nhiều đơn vị thực thi được sao chép ...
Peter Cordes

2
... trên nhiều cổng) ... Điều này có vẻ như lãng phí, nhưng thường thì một vòng lặp sẽ chỉ sử dụng một loại đơn vị thực thi ALU cùng một lúc, do đó, có các bản sao của mọi thứ có nghĩa là bất kỳ loại mã nào đang chạy, có nhiều mã cổng cho hướng dẫn của nó. Vì vậy, lý do bạn trích dẫn để hưởng lợi từ HT không phải là phổ biến, vì hầu hết mã có một số tải và / hoặc cửa hàng chiếm băng thông phía trước và những gì còn lại thường không đủ để bão hòa các đơn vị thực thi.
Peter Cordes

2
@Luaan: Ngoài ra, trong CPU Intel, các đơn vị thực thi số nguyên và FP / vector có chung các cổng thực thi . Ví dụ: các đơn vị FP FMA / mul / add nằm trên các cổng 0/1. Nhưng hệ số nhân cũng nằm trên port1 và ops số nguyên đơn giản có thể chạy trên bất kỳ 4 cổng thực thi nào (sơ đồ trong câu trả lời của tôi). Một luồng thứ hai sử dụng băng thông có vấn đề sẽ làm chậm cả hai ngay cả khi chúng không cạnh tranh cho các đơn vị thực thi, nhưng thường có mức tăng thông lượng ròng nếu chúng không cạnh tranh quá tệ cho bộ đệm. Ngay cả mã thông lượng cao được điều chỉnh tốt như x264 / x265 (bộ mã hóa video) cũng có lợi khoảng 15% trên Skylake từ HT.
Peter Cordes

3
@luaan Ngoài những gì Peter nói, tuyên bố của bạn rằng "Đó là lý do ban đầu đằng sau HT" là không chính xác. Lý do ban đầu đằng sau HT là vi kiến ​​trúc NetBurst đã kéo dài đường ống đến mức cực đoan như vậy (với mục đích tăng tốc độ đồng hồ) khiến các dự đoán sai và bong bóng đường ống khác hoàn toàn giết chết hiệu suất. HT là một trong những giải pháp của Intel nhằm giảm thiểu lượng thời gian mà các đơn vị thực thi của con chip đắt tiền này đứng ngồi không yên vì bong bóng trong đường ống: mã từ các luồng khác có thể được chèn và chạy trong các lỗ đó.
Cody Grey

24

Không có thứ gọi là một luồng duy nhất chạy trên nhiều lõi cùng một lúc.

Tuy nhiên, điều đó không có nghĩa là các lệnh từ một luồng không thể được thực thi song song. Có các cơ chế được gọi là đường ống dẫn lệnhthực hiện không theo thứ tự cho phép nó. Mỗi lõi có rất nhiều tài nguyên dư thừa không được sử dụng bởi các hướng dẫn đơn giản, do đó, nhiều hướng dẫn như vậy có thể được chạy cùng nhau (miễn là tài nguyên tiếp theo không phụ thuộc vào kết quả trước đó). Tuy nhiên, điều này vẫn xảy ra bên trong một lõi đơn.

Siêu phân luồng là loại biến thể cực đoan của ý tưởng này, trong đó một lõi không chỉ thực hiện các lệnh từ một luồng song song, mà còn trộn các lệnh từ hai luồng khác nhau để tối ưu hóa việc sử dụng tài nguyên hơn nữa.

Các mục Wikipedia liên quan: Hướng dẫn đường ống , thực hiện không theo thứ tự .


3
Họ không thể chạy đồng thời, nhưng họ có thể chạy song song? Đây có phải là điều tương tự?
Evorlor

10
@Evorlor Điều quan trọng ở đây là sự khác biệt giữa lõi và đơn vị thực thi. Một luồng chỉ có thể chạy trên một lõi, nhưng bộ xử lý có thể sử dụng phân tích động để tìm ra các lệnh được thực thi bởi lõi không phụ thuộc lẫn nhau và thực hiện chúng trên các đơn vị thực thi khác nhau một cách đồng thời. Một lõi có thể có một số đơn vị thực hiện.
dùng1937198

3
@Evorlor: CPU không theo thứ tự có thể tìm và khai thác tính song song ở mức hướng dẫn trong luồng lệnh của một luồng. ví dụ: thông thường các hướng dẫn cập nhật bộ đếm vòng lặp độc lập với một số công việc khác mà vòng lặp thực hiện. Hoặc trong một a[i] = b[i] + c[i]vòng lặp, mỗi lần lặp là độc lập, do đó tải, thêm và lưu trữ từ các lần lặp khác nhau có thể trong chuyến bay cùng một lúc. Nó phải duy trì ảo tưởng rằng các hướng dẫn được thực hiện theo thứ tự chương trình, nhưng ví dụ, một cửa hàng bị mất trong bộ đệm không làm trì hoãn luồng (cho đến khi hết dung lượng trong bộ đệm lưu trữ).
Peter Cordes

3
@ user1937198: Cụm từ "phân tích động" sẽ phù hợp hơn với trình biên dịch JIT. CPU không theo thứ tự không thực sự phân tích; nó giống như một thuật toán tham lam chạy bất kỳ hướng dẫn nào đã được giải mã và ban hành và sẵn sàng cho đầu vào của chúng. (Cửa sổ sắp xếp lại không theo thứ tự bị giới hạn bởi một số tài nguyên vi kiến ​​trúc, ví dụ Intel Sandybridge có kích thước Bộ đệm ReOrder là 168 uops. Xem thêm cách đo kích thước ROB bằng thực nghiệm ). Tất cả được thực hiện với các máy trạng thái phần cứng để xử lý 4 uops mỗi đồng hồ.
Peter Cordes

3
@Luaan yeah, đó là một ý tưởng thú vị, nhưng trình biên dịch AOT vẫn không đủ thông minh để khai thác triệt để. Ngoài ra, Linus Torvalds (và những người khác) đã lập luận rằng việc phơi bày rằng phần lớn các phần bên trong của đường ống là một hạn chế lớn đối với các thiết kế trong tương lai. ví dụ: bạn không thể thực sự tăng chiều rộng đường ống mà không thay đổi ISA. Hoặc bạn xây dựng CPU theo dõi các phụ thuộc theo cách thông thường và có thể phát hành song song hai nhóm VLIW, nhưng sau đó bạn đã mất lợi ích phức tạp CPU của EPIC nhưng vẫn có nhược điểm (mất băng thông khi trình biên dịch không thể lấp đầy một từ).
Peter Cordes

22

tóm tắt: Việc tìm kiếm và khai thác tính song song (mức hướng dẫn) trong một chương trình đơn luồng được thực hiện hoàn toàn bằng phần cứng, bởi lõi CPU mà nó đang chạy. Và chỉ qua một cửa sổ của vài trăm hướng dẫn, không sắp xếp lại quy mô lớn.

Các chương trình đơn luồng không nhận được lợi ích từ CPU đa lõi, ngoại trừ việc các thứ khác có thể chạy trên các lõi khác thay vì mất thời gian khỏi tác vụ đơn luồng.


HĐH tổ chức các hướng dẫn của tất cả các luồng theo cách mà chúng không chờ đợi nhau.

HĐH KHÔNG nhìn vào các luồng lệnh của các luồng. Nó chỉ lập lịch trình chủ đề đến lõi.

Trên thực tế, mỗi lõi chạy chức năng lập lịch của HĐH khi cần tìm ra việc cần làm tiếp theo. Lập lịch là một thuật toán phân tán. Để hiểu rõ hơn về các máy đa lõi, hãy nghĩ mỗi lõi là chạy kernel riêng. Giống như một chương trình đa luồng, kernel được viết để mã của nó trên một lõi có thể tương tác an toàn với mã của nó trên các lõi khác để cập nhật cấu trúc dữ liệu được chia sẻ (như danh sách các luồng đã sẵn sàng để chạy.

Dù sao, HĐH có liên quan đến việc giúp các quy trình đa luồng khai thác song song mức luồng phải được phơi bày rõ ràng bằng cách viết thủ công một chương trình đa luồng . (Hoặc bởi một trình biên dịch song song tự động với OpenMP hoặc một cái gì đó).

Sau đó, mặt trước của CPU tổ chức thêm các hướng dẫn đó bằng cách phân phối một luồng cho mỗi lõi và phân phối các lệnh độc lập từ mỗi luồng trong bất kỳ chu kỳ mở nào.

Lõi CPU chỉ chạy một luồng hướng dẫn, nếu nó không bị dừng (ngủ cho đến khi ngắt tiếp theo, ví dụ như ngắt hẹn giờ). Thường thì đó là một luồng, nhưng nó cũng có thể là một trình xử lý ngắt nhân hoặc mã hạt nhân linh tinh nếu kernel quyết định làm một việc gì đó ngoài việc quay lại luồng trước đó sau khi xử lý và ngắt hoặc gọi hệ thống.

Với HyperThreading hoặc các thiết kế khác của SMT, lõi CPU vật lý hoạt động giống như nhiều lõi "logic". Sự khác biệt duy nhất từ ​​góc độ HĐH giữa CPU bốn nhân với siêu phân luồng (4c8t) và máy 8 lõi đơn giản (8c8t) là HĐH nhận biết HT sẽ cố gắng lên lịch các luồng để tách các lõi vật lý để chúng không ' t cạnh tranh với nhau. Một hệ điều hành không biết về siêu phân luồng sẽ chỉ nhìn thấy 8 lõi (trừ khi bạn tắt HT trong BIOS, thì nó sẽ chỉ phát hiện 4).


Thuật ngữ " front-end" dùng để chỉ một phần của lõi CPU lấy mã máy, giải mã các hướng dẫn và đưa chúng vào phần không theo thứ tự của lõi . Mỗi lõi có mặt trước riêng và nó là một phần của toàn bộ lõi. Hướng dẫn nó tìm nạp những gì CPU hiện đang chạy.

Bên trong phần không theo thứ tự của lõi, các lệnh (hoặc uops) được gửi đến các cổng thực thi khi các toán hạng đầu vào của chúng đã sẵn sàng và có một cổng thực thi miễn phí. Điều này không phải xảy ra theo thứ tự chương trình, vì vậy đây là cách CPU OOo có thể khai thác song song mức hướng dẫn trong một luồng .

Nếu bạn thay thế "lõi" bằng "đơn vị thực thi" trong ý tưởng của mình, bạn đã gần sửa. Có, CPU không phân phối các lệnh / uops độc lập cho các đơn vị thực thi song song. (Nhưng có một thuật ngữ trộn lẫn, vì bạn đã nói "front-end" khi thực sự đó là bộ lập lịch hướng dẫn của CPU hay còn gọi là Trạm đặt chỗ chọn các lệnh sẵn sàng để thực thi).

Việc thực hiện ngoài đơn hàng chỉ có thể tìm thấy ILP ở cấp độ rất cục bộ, chỉ tối đa vài trăm hướng dẫn, không phải giữa hai vòng độc lập (trừ khi chúng ngắn).


Ví dụ, asm tương đương với điều này

int i=0,j=0;
do {
    i++;
    j++;
} while(42);

sẽ chạy nhanh như vòng lặp tương tự chỉ tăng một bộ đếm trên Intel Haswell. i++chỉ phụ thuộc vào giá trị trước đó i, trong khi j++chỉ phụ thuộc vào giá trị trước đó j, vì vậy hai chuỗi phụ thuộc có thể chạy song song mà không phá vỡ ảo tưởng về mọi thứ được thực hiện theo thứ tự chương trình.

Trên x86, vòng lặp sẽ trông giống như thế này:

top_of_loop:
    inc eax
    inc edx
    jmp .loop

Haswell có 4 cổng thực thi số nguyên và tất cả chúng đều có các đơn vị cộng, vì vậy nó có thể duy trì thông lượng lên tới 4 inclệnh trên mỗi đồng hồ nếu tất cả đều độc lập. (Với độ trễ = 1, vì vậy bạn chỉ cần 4 thanh ghi để tối đa các thông bằng cách giữ 4 inchướng dẫn trong chuyến bay Ngược lại điều này với vector-FP MUL hoặc FMA:. Độ trễ = 5 thông = 0,5 nhu cầu 10 ắc vector để giữ 10 FMAs trong chuyến bay để tối đa hóa thông lượng. Và mỗi vectơ có thể là 256b, giữ 8 phao chính xác đơn).

Nhánh lấy cũng là một nút cổ chai: một vòng lặp luôn mất ít nhất một toàn bộ đồng hồ trên mỗi lần lặp, bởi vì thông lượng của nhánh lấy được giới hạn là 1 trên mỗi đồng hồ. Tôi có thể đặt thêm một lệnh bên trong vòng lặp mà không làm giảm hiệu suất, trừ khi nó cũng đọc / ghi eaxhoặc edxtrong trường hợp đó nó sẽ kéo dài chuỗi phụ thuộc đó. Đặt thêm 2 lệnh trong vòng lặp (hoặc một lệnh đa uop phức tạp) sẽ tạo ra một nút cổ chai ở mặt trước, vì nó chỉ có thể phát 4 vòng trên mỗi đồng hồ vào lõi không theo thứ tự. (Xem phần Hỏi & Đáp này để biết một số chi tiết về những gì xảy ra đối với các vòng lặp không có nhiều 4 vòng: bộ đệm vòng lặp và bộ đệm uop làm cho mọi thứ trở nên thú vị.)


Trong các trường hợp phức tạp hơn, việc tìm kiếm sự song song đòi hỏi phải nhìn vào một cửa sổ hướng dẫn lớn hơn . (ví dụ: có thể có một chuỗi gồm 10 hướng dẫn mà tất cả phụ thuộc vào nhau, sau đó là một số hướng dẫn độc lập).

Dung lượng bộ đệm Re-Order là một trong những yếu tố giới hạn kích thước cửa sổ không theo thứ tự. Trên Intel Haswell, nó là 192 uops. (Và thậm chí bạn có thể đo nó bằng thực nghiệm , cùng với khả năng đổi tên đăng ký (kích thước tệp đăng ký).) Các lõi CPU công suất thấp như ARM có kích thước ROB nhỏ hơn nhiều, nếu chúng thực hiện không theo thứ tự.

Cũng lưu ý rằng CPU cần phải được sắp xếp theo đường ống, cũng như không theo thứ tự. Vì vậy, nó phải tìm nạp và giải mã các hướng dẫn trước các lệnh được thực thi, tốt nhất là có đủ thông lượng để nạp lại bộ đệm sau khi bỏ lỡ bất kỳ chu kỳ tìm nạp nào. Các chi nhánh rất phức tạp, bởi vì chúng ta không biết lấy từ đâu nếu chúng ta không biết một nhánh đi theo hướng nào. Đây là lý do tại sao dự đoán chi nhánh rất quan trọng. (Và tại sao các CPU hiện đại sử dụng thực thi đầu cơ: họ đoán rằng một nhánh sẽ đi theo hướng nào và bắt đầu tìm nạp / giải mã / thực thi luồng lệnh đó. Khi phát hiện sai, chúng quay trở lại trạng thái tốt nhất đã biết và thực hiện từ đó.)

Nếu bạn muốn đọc thêm về phần bên trong CPU, có một số liên kết trong wiki thẻ Stackoverflow x86 , bao gồm hướng dẫn microarch của Agner Fog , và các bản ghi chi tiết của David Kanter với sơ đồ về CPU Intel và AMD. Từ bản ghi vi kiến ​​trúc Intel Haswell của mình , đây là sơ đồ cuối cùng của toàn bộ đường ống của lõi Haswell (không phải toàn bộ chip).

Đây là một sơ đồ khối của một đơn lõi CPU . Một CPU lõi tứ có 4 trong số này trên một chip, mỗi chip có bộ nhớ L1 / L2 riêng (chia sẻ bộ đệm L3, bộ điều khiển bộ nhớ và kết nối PCIe với các thiết bị hệ thống).

Đường ống đầy đủ Haswell

Tôi biết điều này là vô cùng phức tạp. Bài viết của Kanter cũng cho thấy các phần của điều này để nói về frontend riêng biệt với các đơn vị thực thi hoặc bộ đệm, chẳng hạn.


2
"Việc tìm và khai thác tính song song (mức hướng dẫn) trong chương trình đơn luồng được thực hiện hoàn toàn bằng phần cứng" Lưu ý rằng điều này chỉ áp dụng cho các ISA thông thường, không phải là VLIW trong đó ILP được xác định hoàn toàn bởi trình biên dịch hoặc lập trình viên hoặc hợp tác giữa phần cứng và phần mềm.
Hadi Brais

1
@ user7813604: có. Siêu phân luồng không thể song song một chuỗi. Nó làm ngược lại: nó chạy nhiều luồng trên một lõi, làm giảm hiệu suất trên mỗi luồng nhưng tăng thông lượng tổng thể.
Peter Cordes

1
@ user7813604: Toàn bộ quan điểm của ILP là tìm ra các hướng dẫn có thể được chạy song song trong khi vẫn duy trì ảo tưởng rằng mỗi lệnh chạy theo thứ tự, mỗi lệnh hoàn thành trước khi bắt đầu tiếp theo. Một CPU đường ống vô hướng đôi khi có thể cần phải dừng lại cho các phụ thuộc nếu độ trễ cao hơn 1. Nhưng đó là một thỏa thuận thậm chí còn lớn hơn đối với các CPU siêu phẳng.
Peter Cordes

1
@ user7813604: có, câu trả lời của tôi thực sự sử dụng nó làm ví dụ. Ví dụ, Haswell có thể thực thi tối đa 4 inclệnh trong cùng một chu kỳ xung nhịp, với 4 đơn vị thực thi ALU nguyên.
Peter Cordes

1
@ user7813604: Có, ILP là bao nhiêu có thể được thực thi song song. Một CPU thực sự sẽ có khả năng hạn chế để tìm và khai thác ILP bằng cách thực sự chạy song song trong một lõi đơn, ví dụ như siêu khối lên đến 4 chiều trong Intel. Câu trả lời này cố gắng giải thích điều đó với các ví dụ.
Peter Cordes
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.