Có điều gì PHẢI được thực hiện trên CPU đa lõi không?


45

Khi xem xét chương trình của chúng tôi phải thân thiện với đa luồng như thế nào, nhóm của tôi đã tự hỏi liệu có bất cứ điều gì hoàn toàn không thể thực hiện được trên CPU một lõi hay không. Tôi đã khẳng định rằng việc xử lý đồ họa đòi hỏi xử lý song song ồ ạt, nhưng họ cho rằng những việc như DOOM đã được thực hiện trên các CPU lõi đơn không có GPU.

Có bất cứ điều gì phải được thực hiện trên một bộ xử lý đa lõi?

Giả sử có thời gian vô hạn cho cả phát triển và chạy.


8
Mặc dù các câu trả lời dưới đây dường như chủ yếu là không có, nhưng có những hệ thống trong lịch sử không thể hoạt động mà không có bộ đồng xử lý xử lý một số nhiệm vụ. Một ví dụ mạnh mẽ mà tôi biết là Nintendo DS, bao gồm CPU ARM9 67 MHz và CPU ARM7 33 MHz (cũng được sử dụng cho back-compat khi chơi game GBA). Đối với các trò chơi DS, ARM7 xử lý giao tiếp âm thanh & Wi-Fi vì ARM9 không thể xử lý và rút bất kỳ lưu ý nào lên màn hình trong khi theo kịp việc đưa âm thanh vào chip âm thanh trực tiếp. Vì vậy, như @jmite tuyên bố trên hệ thống điều khiển những gì ràng buộc, thiếu tốc độ có thể yêu cầu nhiều CPU.
Slipp D. Thompson

10
Trong công việc của mình, chúng tôi sử dụng nhiều lõi Xeons và các phần mở rộng Linux thời gian thực Xenomai để xử lý âm thanh có độ trễ thấp. Chúng tôi có một đường ống xử lý âm thanh ba giai đoạn và mỗi giai đoạn có lõi chuyên dụng riêng, nó sử dụng ~ 70% các chu kỳ. Các tác vụ không theo thời gian thực có thể sử dụng lõi thứ tư và bất kỳ chu kỳ nào còn sót lại trên ba đầu tiên. Điều này chỉ có thể xảy ra với CPU lõi đơn nếu lõi đơn đó nhanh hơn 3 lần so với lõi trên CPU 4 lõi hiện tại; cho rằng CPU hiện tại chạy ở tốc độ 2GHz, điều đó có thể khó đạt được.
Jeremy Friesner

19
Phần mềm trên CPU lõi đơn có thể mô phỏng CPU đa lõi. Sự khác biệt là gần như hoàn toàn tốc độ.
dùng253751

24
Một điều phải được thực hiện trên một hệ thống đa lõi là thử nghiệm phần mềm đa luồng. Bởi vì một số khiếm khuyết sẽ (gần như) không bao giờ xảy ra trên hệ thống đơn lõi. Tôi không chắc rằng nó đủ điều kiện như một câu trả lời, mặc dù ...
nikie

13
@nikie Một hệ thống lõi đơn cũng có thể mô phỏng thứ tự bộ nhớ và bộ nhớ đệm cũ - nhưng tôi tưởng tượng điều này sẽ cực kỳ kém hiệu quả (như làm chậm 10 ×)
Nayuki

Câu trả lời:


47

Nếu bạn không quan tâm đến thời gian chạy, bất cứ điều gì bạn có thể làm trên máy đa lõi, bạn có thể làm trên máy đơn lõi. Một máy đa lõi chỉ là một cách để tăng tốc một số loại tính toán.

Nếu bạn có thể giải quyết một vấn đề trong thời gian trên một máy đa lõi với n lõi, sau đó bạn có thể giải quyết nó thời gian ~ T n (hoặc ít hơn nhìn vào luật Amdahl ) trên một máy lõi đơn. Máy lõi đơn có thể mô phỏng máy đa lõi bằng cách sử dụng thời gian cắt / chia sẻ thời gian .TnTn


3
Tôi không hoàn toàn chắc chắn đó là hoàn toàn chính xác. Tôi không nghĩ rằng các lỗi nhất quán bộ nhớ có thể tạo ra trên một lõi đơn (Có, người ta có thể mô phỏng một hệ thống đa lõi trên một điểm đơn lẻ, nhưng sự thiếu quyết đoán như vậy là loại gian lận.). (Có lẽ tương đương với việc thực hiện trao đổi reg bằng cách di chuyển ops trong VLIW, khai thác được bảo đảm | | ism?) Tôi cho rằng ngay cả trên lõi đơn luồng vẫn có thể trích xuất entropy từ biến thiên thời gian đa luồng, nhưng số lượng entropy sẽ nhỏ hơn trên mỗi đơn vị thời gian (đó thực sự chỉ là vấn đề hiệu suất như các khác biệt khác).
Paul A. Clayton

6
@ PaulA.Clayton Lỗi nhất quán bộ nhớ thường không mong muốn và phần mềm được viết tốt không nên trưng bày chúng. Tuy nhiên, nếu bạn thực sự muốn, bạn có thể mô phỏng chúng trên một CPU. (Mặc dù có thể chậm)
user253751

4
Đôi khi thời gian trên một lõi đơn sẽ dài hơn lần so với trên máy n -core, ví dụ như để tìm kiếm với khởi động lại ngẫu nhiên hoặc nếu các mảnh phù hợp với bộ đệm trên nhiều lõi nhưng không phải trên lõi đơn. nn
András Salamon

11
"Máy đơn lõi có thể mô phỏng máy đa lõi bằng cách sử dụng thời gian cắt / chia sẻ thời gian." Và thực sự đã làm như vậy kể từ buổi bình minh của Hệ điều hành "hiện đại".
Cuộc đua nhẹ nhàng với Monica

1
@ PaulA.Clayton Tôi nghĩ rằng bạn có thể gặp các vấn đề về tính nhất quán của bộ nhớ (như gia tăng phi nguyên tử) nếu bạn có hai quy trình khác nhau, cả hai đều sửa đổi cùng một bộ nhớ. Bạn chỉ cần đa tác vụ trước. Tất nhiên, đây thường là lý do tại sao các hệ điều hành hiện đại không có các quy trình chia sẻ cùng một bộ nhớ có thể ghi trừ khi chúng yêu cầu rõ ràng.
Patrick M

58

Câu hỏi là: dưới những ràng buộc nào?

Chắc chắn có vấn đề trong đó, nếu chúng ta đặt câu hỏi "chúng ta có thể giải quyết vấn đề này trên phần cứng X trong khoảng thời gian nhất định không", câu trả lời sẽ là không.

Nhưng đây không phải là câu trả lời "bằng chứng trong tương lai": những điều trong quá khứ không thể thực hiện đủ nhanh trong một lõi có thể là bây giờ và chúng ta không thể dự đoán phần cứng trong tương lai sẽ có khả năng gì.

Về khả năng tính toán, chúng tôi biết rằng Máy Turing một băng có khả năng tính toán tất cả các chức năng tương tự như một máy tính đơn hoặc đa lõi, vì vậy, thời gian chạy sang một bên, không có vấn đề nào mà máy tính đa lõi có thể giải quyết lõi đơn không thể.

Về mặt thứ gì đó như đồ họa, mọi thứ trên GPU đều có thể được thực hiện trên CPU ... nếu bạn sẵn sàng chờ đợi đủ lâu.


3
@JanDvorak Tôi thực sự sẽ nói rằng điều này hoàn toàn không được thực hiện bởi GPU;)
TomTom

15
Nếu thời gian không phải là một hạn chế, bạn có thể thực hiện tất cả các tính toán bằng tay, bút và giấy.
toán học

2
@mathreadler Vâng, vì bộ não là Turing Complete. Một cái gì đó đã biến thành một cuộc tranh luận kéo dài trên Vật lý Stackexchange.
JBentley

4
Trên thực tế, @JanDvorak, tạo VGA khá đơn giản và có thể được thực hiện trong phần mềm trên bộ điều khiển vi mô thấp 16 MHz, vì dự án này cho thấy: pyroelectro.com/tutorials/arduino_basic_vga
axello

3
@mathreadler Đó thực sự là một câu hỏi phức tạp hơn lần đầu tiên xuất hiện. Một câu trả lời ngắn có thể là "có" bởi vì một máy chuyên dụng có thể xây dựng một máy tính mà không yêu cầu bất kỳ công cụ hoàn chỉnh nào để làm như vậy. Câu trả lời dài hơn có thể là "không", vì khả năng xây dựng một máy Turing có thể ngụ ý rằng một máy có một máy Turing lớn hơn ở trạng thái "khởi tạo" trong đó nó xây dựng phần còn lại của máy trạng thái. Câu trả lời đầy đủ thậm chí còn phức tạp hơn vì chúng tôi chưa bao giờ chế tạo một thiết bị Turing Complete. Chúng tôi đã phát triển những ý tưởng trừu tượng cho các máy móc ...
Cort Ammon

17

Như các câu trả lời khác đã chỉ ra, một CPU duy nhất luôn có thể mô phỏng nhiều CPU bằng cách cắt thời gian và đóng vai trò của từng CPU ảo. Thi đua này chắc chắn sẽ tính toán các câu trả lời chính xác.

Trong thế giới thực, thời gian thực hiện có thể quan trọng. Nó có thể có nghĩa là sự khác biệt giữa tốc độ khung hình tầm thường và trải nghiệm hình ảnh xuất sắc. Hoặc sự khác biệt giữa lãi và lỗ trong giao dịch.

Một tình huống bệnh lý nơi một đa là bao la nhanh hơn so với một bộ xử lý đơn là nơi chế biến là một đường ống dữ liệu, chuyển đổi bối cảnh là tốn kém, và mã máy cho từng giai đoạn đường ống chỉ vừa đủ phù hợp trong bộ nhớ cache của CPU.

Hãy để tôi minh họa với một số con số. Giả sử bạn có một đường dẫn dữ liệu (kết xuất 3D, v.v.) có 4 giai đoạn xử lý, mỗi giai đoạn có 256 KiB mã chương trình và bạn thuận tiện có 4 CPU với bộ đệm L2 256 KiB. Nếu bạn cố gắng chạy quá trình xử lý này trên một CPU, thì việc chuyển đổi giữa 4 tác vụ sẽ tốn kém và liên quan đến việc bỏ lỡ bộ nhớ cache nặng. Mặt khác, nếu bạn chạy nó trên hệ thống 4 lõi, việc tính toán có thể rất trơn tru, các lỗi bộ nhớ cache là tối thiểu và các chuyển đổi ngữ cảnh là không tồn tại. (Như một lưu ý phụ, điều này có liên quan đến khái niệm ghim một số ứng dụng vào một số lõi nhất định - ví dụ: chỉ thực hiện các hoạt động của nhân hệ điều hành trong một lõi hoặc xử lý TCP / IP, v.v.)


7

Khó hơn nhiều để phát triển các cuộc đua dữ liệu thực sự bất chính với một CPU. Ý tôi là, chắc chắn, bạn có thể thoát khỏi việc xé giữa các từ nếu bạn làm gián đoạn một CPU, nhưng bạn có thể xây dựng các kịch bản kỳ lạ khi không có các luồng xen kẽ nào làm những gì bạn muốn không?

Được rồi, có thể làm cho các lỗi xảo quyệt không được tính là sử dụng hợp lệ các tiến bộ đa mã. Hóa ra, không có nhiều đột biến mà lõi đơn có thể làm được mà lõi đơn không thể có thời gian. Lý do rất đơn giản. Nếu bạn cố gắng tránh các cuộc đua dữ liệu xấu đó, bạn phải có các điểm đồng bộ hóa trong mã của mình. Nếu bạn lập mô hình mã của mình dưới dạng một mạng tính toán trong đó các đầu vào phải được hoàn thành và đồng bộ hóa trước khi bạn có thể tính toán và tạo đầu ra, thì dễ dàng thấy rằng một CPU đơn giản có thể hoạt động theo cách của chúng dọc theo mạng, tính toán khối công việc có sẵn tiếp theo .

Trên thực tế, nếu bạn có thể chứng minh rằng thuật toán của bạn có thể được giải quyết bằng máy Turing (hầu như mọi thuật toán chúng tôi quan tâm), có thể chứng minh rằng thuật toán có thể được thực hiện không chỉ bởi một CPU lõi đơn, mà trên thực tế là máy trạng thái với một đoạn băng rất dài cho bộ nhớ!

Trình phát hiện cuộc đua CHESS thực sự tận dụng điều này để tìm trường hợp cuộc đua. Nó chạy mọi thứ đơn lẻ và khám phá một cách có hệ thống tất cả các xen kẽ có thể giữa các luồng, cố gắng tìm các trường hợp trong đó một bài kiểm tra thất bại vì một trường hợp đua. CHESS phụ thuộc vào thực tế là bạn có thể chạy bất kỳ ứng dụng đa luồng nào trên một lõi đơn.

Các trường hợp bạn cần đa lõi xuất hiện khi bạn bắt đầu kéo dài giới hạn của phần cứng. Một điều hiển nhiên là khi bạn gặp khó khăn về thời gian. Một số vấn đề với các ràng buộc thời gian thực là không thể thực hiện lõi đơn vì đơn giản là chúng không thể điều khiển đồng hồ của một lõi đủ nhanh. Có một lý do CPU tăng lên đến 4Ghz và sau đó ổn định một chút, thích nhiều lõi hơn ở tốc độ thấp hơn.

Một phiên bản kỳ lạ hơn của ràng buộc thời gian này là trong các hệ thống thời gian thực cứng. Trong một số hệ thống thời gian thực cứng, dịch vụ ngắt rất khắt khe đến mức bạn thực sự phải chọn CPU đa lõi cho phép bạn phân chia các ngắt trên các lõi hoặc bạn gặp phải các giới hạn về thời gian.

Một giới hạn khác phát sinh với các bus dữ liệu. Hãy xem xét Blue Gene / P làm ví dụ. JUGENE, một siêu máy tính Blue Gene / P đặc biệt, có bộ nhớ 144 terabyte . Họ chỉ đơn giản là không tạo ra các máy tính CPU đơn có thể truy cập tất cả bộ nhớ đó.


1
Re, Họ chỉ đơn giản là không tạo ra các máy tính CPU đơn có thể truy cập bộ nhớ [nhiều]. "Đừng" không giống như "không thể". Bạn có thể thiết kế và xây dựng bộ xử lý đơn với bộ nhớ chính 144 terabyte trở lên. Lý do duy nhất mà mọi người không làm là vì lợi nhuận giảm dần: Giá trị thực tế, tăng thêm bộ nhớ cho thiết kế bộ xử lý đơn lẻ đạt đến đỉnh điểm tại một số điểm và sau đó giảm xuống khi kích thước bộ nhớ tăng lên, trong khi chi phí gia tăng không đổi .
Solomon Chậm

@jameslarge Đó là lý do tại sao câu đó xuất hiện trong phần câu trả lời của tôi khi thảo luận về phần cứng thực tế trong cuộc sống thực và tại sao nó không xuất hiện trong 2/3 câu trả lời đầu tiên thảo luận về năng lực lý thuyết.
Cort Ammon

"Đừng" so với "Không thể" được minh họa bởi hai hệ thống trong tầng hầm của tôi. Nếu tôi có thể thêm nhiều bộ nhớ đó vào cấu hình phần cứng của chúng, CPU của chúng "có thể" truy cập từng byte. Nhưng tôi không thể, vì vậy họ "không thể". Khả năng của CPU là vượt quá thực tế.
dùng2338816

Tôi đã suy nghĩ một cái gì đó như câu trả lời này. Có vẻ như điều kiện cuộc đua sẽ là không thể (hoặc xảy ra 100% thời gian) trong môi trường lõi đơn. Đối với một ứng dụng thực tế, tôi đưa ra giả thuyết rằng một nhà phát triển phần mềm có thể thiết kế một số hình thức bảo vệ bản sao duy nhất bằng cách mã hóa một số thử nghiệm điều kiện cuộc đua kỳ lạ luôn vượt qua phần cứng mục tiêu cụ thể, nhưng sẽ thất bại trên phần cứng giả lập được chạy bởi một lõi đơn . Trong trường hợp này, thi đua bởi một hệ thống đa lõi đôi khi có thể vượt qua, nhưng không đáng tin cậy.
Dan Henderson

6

Nếu bạn cần quan sát một quy trình chạy trên một phần tử xử lý duy nhất mà không làm ảnh hưởng đến hành vi thời gian thực của nó (hoặc ít nhất có thể), như để ghi điểm chuẩn hoặc ghi nhật ký hoạt động, có thể bạn sẽ cần một tài nguyên xử lý riêng.


Ví dụ hay, ngắn gọn về một cái gì đó sẽ yêu cầu mô phỏng chính xác nếu không phải là nhiều bộ xử lý
Ben Leggiero

Này, đây có phải là tài khoản của bạn không? Mayby bạn muốn hợp nhất nó?
Ác quỷ

4

Các câu trả lời khác tuân theo quan điểm hạn chế về tính song song là "đồng thời phân tán". Điều này đưa ra một số câu trả lời: trong một mô hình tính toán rõ ràng à la Turing, nhiều lõi không mang lại lợi thế; lợi thế duy nhất bạn có thể nhận được là hiệu quả.

những một điều nhiều đơn vị chế biến (mủ) có thể làm điều đó một trong những đơn không thể, mặc dù: thực hiện các hoạt động song song , có nghĩa là cùng một lúc .

Điều đó rất hữu ích nếu bạn chạy nhiều chương trình cùng một lúc. Cấp, chỉ hiếm khi bạn thực sự cần nhiều hơn thực hiện đồng thời, và hầu hết các sử dụng đều giảm hiệu quả. Nhưng có sự khác biệt này.

Giả sử bạn cần xử lý dữ liệu cảm biến dữ liệu từ nhiều nguồn trong thời gian thực. Bất kể điều đó có nghĩa chính xác trong ứng dụng của bạn, một PU chỉ có thể xử lý đồng thời rất nhiều luồng đầu vào mà không vi phạm giới hạn thời gian phản hồi của nó. Vì vậy, bạn cần nhiều PU khi bạn có quá nhiều cảm biến cho thế hệ PU hiện tại của mình.

k

kkk


0

từ một POV CS, "đa lõi" về mặt lý thuyết không khác nhiều so với "điện toán phân tán". khái niệm cơ bản là "các yếu tố điện toán độc lập (tính toán song song". Vì vậy, hơi lặp lại câu hỏi ("đa lõi" không thực sự chính xác là một khái niệm lý thuyết trong CS) dẫn đến một số khả năng khác. Như đã chỉ ra trong các câu trả lời khác, lập trình tuần tự là tương đương với lập trình song song từ một POV CS. Điều này quay trở lại định nghĩa của hệ thống lý thuyết cho máy tính, cụ thể là máy Turing. Phân tích lý thuyết về hiệu suất CS cuối cùng là về các TM mà sự phân biệt song song và tuần tự không thực sự được áp dụng ( mặc dù có một số tương tự thô với TM đa nhiệm ).

nhưng xem xét câu hỏi này ít trừu tượng hơn, điện toán phân tán thực sự vượt trội hoặc gần như thậm chí cần thiết cho một số vấn đề liên quan đến khả năng chịu lỗi . trong lĩnh vực này có một khái niệm áp dụng khi / trong đó các yếu tố điện toán độc lập được thực hiện để có một mức độ không đáng tin cậy (đây không thực sự là một giả định áp dụng chung cho tất cả các bối cảnh). đây là một số trường hợp khả năng chịu lỗi được cải thiện với hoặc thậm chí yêu cầu các yếu tố điện toán độc lập.

  • xem xét rằng mỗi bộ xử lý có khả năng thất bại "[x]%" độc lập trong quá trình tính toán. một hệ thống có thể được tạo ra nhờ đó thông qua giao tiếp, khả năng chịu lỗi tổng thể của hệ thống cao hơn các thành phần riêng lẻ. điều này đã được áp dụng từ nhiều thập kỷ trước, ví dụ như trong các hệ thống Tàu con thoi. gần đây có các giao thức cơ bản được thiết kế để sử dụng nó, ví dụ như Paxos giải quyết vấn đề được gọi là đồng thuận . một ví dụ thực tế hơn là Google có rất nhiều thuật toán độc quyền để xây dựng (các) siêu máy tính của họ từ các yếu tố không đáng tin cậy riêng lẻ cùng với các thuật toán chịu lỗi.

  • Bitcoin liên quan đến các giao dịch phân tán để tính toán sổ cái và đó không chỉ đơn thuần là do các vấn đề tải xử lý tuyệt đối. thuật toán được thiết kế cẩn thận để ngăn chặn các nút hỏng. Nói tóm lại, nó "giải quyết" / thực hiện vấn đề về tướng Byzantine không chỉ đơn thuần là tối đa hóa hiệu suất song song, nó liên quan đến các thực thể độc lập "kiểm tra" lẫn nhau và "thuật toán / mật mã / an toàn" từ chối tính toán không hợp lệ hay còn gọi là "gian lận" hoặc "gian lận" tham nhũng ".

  • một phân tích cổ điển về song song kết luận có khoảng 7 kiểu mẫu vấn đề "cơ bản" phân rã thành các sự cố thực thi song song cụ thể. xem Cảnh nghiên cứu tính toán song song: Một góc nhìn từ Berkeley

  • có một số yếu tố của một câu hỏi lý thuyết mở ở đây xem xét hiệu suất wrt được giải quyết trong hầu hết các câu trả lời khác. câu hỏi liệu có bất kỳ vấn đề nào "nhanh hơn vốn có" song song so với tuần tự hay không cũng được gọi là vấn đề P =? NC trong đó NC được coi là lớp của thuật toán "song song hiệu quả" và P là thuật toán "tuần tự hiệu quả" "


1
Tôi thích câu trả lời này! Tôi đã học được rất nhiều từ các ví dụ của bạn: D
Ben Leggiero

+1 cho khả năng chịu lỗi trong các môi trường quan trọng với nhiệm vụ với bức xạ, -1 cho việc thiếu mũ và dự phòng.
Cees Timmerman
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.