Các thuật toán phụ thuộc vào kiến ​​trúc máy tính?


22

Tôi đọc ở đâu đó (quên cuốn sách nào) rằng các thuật toán độc lập với kiến ​​trúc máy tính. Một số thậm chí nói thuật toán là chính họ tính toán (máy móc?)?

Mặt khác, các cuốn sách về lập trình song song có các chương về các thuật toán song song. Có vẻ như các thuật toán song song phụ thuộc vào kiến ​​trúc song song?

Tôi nghĩ rằng tôi bỏ lỡ một số hình ảnh lớn? Cảm ơn.


quicksort tốt hơn sau đó hợp nhất sắp xếp?
AK_

Các thuật toán song song có thể chạy trên các kiến ​​trúc đơn luồng. Cắt thời gian được hỗ trợ bởi hầu hết các kiến ​​trúc đó, và ai nói rằng các nhiệm vụ song song phải chạy đồng thời? Nếu A và B song song, tại sao bạn không thể chạy A thì B? Hoặc xen kẽ chúng nếu người này dựa vào người kia (nhưng nói chung đó là một ý tưởng tồi).

3
Các thuật toán được chỉ định dựa trên một máy trừu tượng . Một điển hình là lý tưởng hóa các máy tính cá nhân đa lõi ngày nay được gọi là PRAM (Máy truy cập ngẫu nhiên song song , đôi khi được phân loại thành EREW (đọc / ghi bộ nhớ độc quyền) hoặc CRCW (đọc / ghi bộ nhớ đồng thời).
rwong

@rwong: máy trừu tượng hoàn toàn độc lập với kiến ​​trúc máy tính, nếu thuật toán là?
Tim

2
Các thuật toán (và cấu trúc dữ liệu) có thể được tối ưu hóa cho các kiến ​​trúc cụ thể - ví dụ: B + Tree là cấu trúc dữ liệu liên kết được tối ưu hóa cho các kiến ​​trúc trong đó việc đọc một khối dữ liệu lớn rẻ hơn so với đọc một số khối nhỏ.
dùng253751

Câu trả lời:


20

Thuật toán là một loạt các bước được thực hiện để giải quyết một vấn đề cụ thể. Các công thức để giải quyết vấn đề, nếu bạn sẽ. "Các chương trình" làm những điều tương tự, tất nhiên; chúng tôi sử dụng "thuật toán" để đề xuất các công thức "tổng quát" hoặc "thường áp dụng" độc lập với các thiết kế máy cụ thể, ngôn ngữ lập trình, v.v.

Các thuật toán có nghĩa là chung chung, nhưng chúng vẫn có thể phụ thuộc vào một số tính năng hiện diện. "Thuật toán đồng thời", chẳng hạn, có thể phụ thuộc vào việc bạn có một số cơ chế để các chương trình khác nhau chạy đồng thời. "Thuật toán phân tán" có thể phụ thuộc vào việc bạn có nhiều hơn một hệ thống trong một nhóm hợp tác và mạng hoặc sơ đồ liên lạc khác giữa chúng. Tương tự, "thuật toán song song" thường là những thuật toán được thiết kế để chạy khi bạn có nhiều đơn vị xử lý - có khả năng nhiều, nhiều đơn vị xử lý và loại phương tiện truyền thông phổ biến khi bạn có các mảng đơn vị xử lý lớn. Bạn có thể chạy "thuật toán song song" ngay cả khi bạn chỉ có một máy tính hoặc một CPU - nhưng nó không thú vị lắm trong cách các kỹ sư giao thông không phải là '


13

Các thuật toán độc lập với kiến ​​trúc máy tính. Đó là bởi vì các thuật toán xác định một loạt các quy trình giải quyết vấn đề. Bất kể kiến ​​trúc, thuật toán sắp xếp sẽ luôn luôn sắp xếp. Nó sẽ không đột nhiên vẽ các bản vẽ 3D trên một số kiến ​​trúc.

Nếu bạn nghĩ về nó, điều này thực sự trực quan. Google Chrome (chỉ đơn thuần là một tập hợp các thuật toán) là một trình duyệt web khi được biên dịch cho bất kỳ kiến ​​trúc nào. Nó sẽ không đột nhiên trở thành một trình điều khiển thiết bị trên một số kiến ​​trúc.

Nhưng tốc độ chạy thuật toán phụ thuộc vào kiến ​​trúc. Và một số thuật toán hoạt động nhanh hơn các thuật toán khác tùy thuộc vào kiến ​​trúc.

Nếu bạn nghĩ về nó, điều này cũng thực sự trực quan. Đưa ra một thuật toán, nhà thiết kế phần cứng luôn có thể thiết kế một kiến ​​trúc đặc biệt tăng tốc thuật toán đó. Đó là một lý do tại sao có những thứ như card đồ họa tăng tốc 3D và máy gia tốc khai thác bitcoin.

Khi mọi người nói về các thuật toán song song, họ đang nói về một nhóm thuật toán có thể hoạt động nhanh hơn trên các kiến ​​trúc song song. Có rất nhiều thuật toán không được cải thiện bởi các kiến ​​trúc song song. Vì vậy, xác định các thuật toán mới cho cùng một vấn đề hoạt động tốt song song là một lĩnh vực nghiên cứu tích cực.

Nhưng những thuật toán đó vẫn làm những điều tương tự. Kiến trúc không thay đổi những gì họ làm.


"Nhưng tốc độ chạy thuật toán phụ thuộc vào kiến ​​trúc. Và một số thuật toán hoạt động nhanh hơn các thuật toán khác phụ thuộc vào kiến ​​trúc." Tôi nghĩ rằng điều này làm cho một câu trả lời có giá trị.
Rıdvan Nuri Göçmen

4

"Có vẻ như các thuật toán song song phụ thuộc vào kiến ​​trúc song song?"

Theo tôi câu trả lời đơn giản là: không. Chung tôi chỉ nhận được tài sản

  • song song
  • kích thước từ (giới hạn tài nguyên ngầm)

khi nghĩ về kiến ​​trúc phần cứng.

Đề cập đến tính song song, bạn có thể có bất kỳ thuật toán song song nào được tính toán theo lô và bất kỳ vòm song song nào để làm việc nối tiếp để thuật toán không phụ thuộc vào điều đó. Kích thước từ có thể là một vấn đề đối với sự ổn định số nhưng không phải là chính thuật toán. Các giới hạn tài nguyên như 64 bit chỉ có thể mô tả 2 ^ 64 số khác nhau có thể là một vấn đề, nhưng dù sao các yếu tố bị hạn chế.

Tất nhiên có thể có một số thuật toán phụ thuộc vào một số bộ hướng dẫn mở rộng, nhưng ít nhất mọi thứ có thể được mô tả bằng toán học cơ bản.

Ví dụ với tính toán lượng tử, một số giá trị Big-O có thể thay đổi và sau đó tôi sẽ nói rằng

"Các thuật toán độc lập với kiến ​​trúc máy tính"

không còn đúng nữa


4

Các thuật toán không phụ thuộc vào kiến ​​trúc máy tính, tuy nhiên hiệu quả của việc chạy bất kỳ thuật toán cụ thể nào phụ thuộc vào kiến ​​trúc. Bất kỳ máy Turing Complete nào cũng có thể mô phỏng bất kỳ máy Turing Complete nào khác, mặc dù một số máy sẽ tốt hơn một thứ so với các máy khác.

Điều chúng tôi muốn nói đến bởi các thuật toán đồng thời là thuật toán chơi tốt hoặc có thể tận dụng đồng thời trong máy, có thể vì nó yêu cầu ít khóa hơn mà các thuật toán không được thiết kế riêng cho máy đồng thời hoặc có thể vì thuật toán sử dụng phân chia và chinh phục hiệu quả để sử dụng toàn bộ sức mạnh của máy. Chạy thuật toán trong một máy không đồng thời vẫn có thể nhưng có thể không hiệu quả hoặc nó có thể yêu cầu khóa bổ sung để thực hiện chính xác.

Ngoài ra còn có các thuật toán được thiết kế để tận dụng lợi thế của một kiến ​​trúc cụ thể, như các thuật toán thân thiện với bộ đệm, giúp tối ưu hóa bộ đệm. Các thuật toán này có thể kém hiệu quả hơn trong các máy không lưu cache theo cách mà thuật toán giả định.


3

Về lý thuyết, các thuật toán hoàn toàn độc lập với kiến ​​trúc. Bạn luôn có thể mô phỏng kiến ​​trúc song song trên một hệ thống có thời gian một vấn đề. Bạn có thể suy luận về các thuật toán mà không có kiến ​​trúc nào cả. Cuốn sách của Knuth sử dụng một kiến ​​trúc hư cấu.

Trong thực tế, có các thuật toán cố gắng đạt được thời gian chạy tốt hơn cho cùng độ phức tạp "O" bằng cách tối ưu hóa việc sử dụng phần cứng bộ đệm và các nguyên hàm đồng bộ hóa.


3

Có và không. Nó phụ thuộc vào các ràng buộc bạn muốn đáp ứng và các điều kiện tiên quyết cần thiết để chạy thuật toán của bạn.

Lý tưởng nhất, một thuật toán là một công thức trừu tượng xác định từng bước làm thế nào để làm một cái gì đó. Các thuật toán được định nghĩa như vậy với mục tiêu tái sản xuất và tự động hóa sau này. Các thuật toán bắt nguồn từ tính toán lambda, vì vậy bạn có thể dễ dàng thấy lý do tại sao chúng được thực hiện theo cách như vậy. Định nghĩa này là thông thường, nhưng các thuật toán hiện đại có thể không tuần tự (không phải từng bước, như thuật toán đồng thời hoặc logic như thuật toán sử dụng thống nhất), phi tuyến tính (thuật toán ngẫu nhiên) hoặc chỉ đơn giản là kỳ lạ (lượng tử thuật toán), nhưng tôi sẽ vượt qua nó.

Vì vậy, lý tưởng nhất, một thuật toán nên càng trừu tượng càng tốt mà không tính bất kỳ phần cứng nào.

Nhưng, như với bất kỳ hệ thống nào, bạn phải xác định một số tiên đề , không chỉ để có được một hệ thống mạch lạc, mà còn để đạt được thời gian. Ví dụ, hầu hết các thuật toán đều cho rằng, ít nhất là ngầm định, chúng được định nghĩa trên máy Von-Neumann. Nếu đó không phải là trường hợp, họ sẽ cần xác định rõ ràng từng phần của hệ thống mà họ cần được chạy (vì điều này là bắt buộc để sao chép công thức, đây là một điều kiện tiên quyết). Ngoài ra, thường các thuật toán dựa vào các lệnh phổ biến như write () mà không xác định chúng đầy đủ.

Một lý do khác tại sao các thuật toán không quá trừu tượng từ kiến ​​trúc phần cứng, là khi bạn cần phải đáp ứng một số ràng buộc .

Giả sử bạn đang làm việc trên các hệ thống nhúng, thì có lẽ bạn không thể dựa vào cùng một lượng tài nguyên bạn có trên máy trạm. Một trong những tài nguyên bị hạn chế nhất có lẽ là bộ nhớ. Tuy nhiên, hầu hết các thuật toán có xu hướng tối ưu hóa độ phức tạp thời gian (tốc độ thực thi trên CPU), chứ không phải độ phức tạp của bộ nhớ (lượng bộ nhớ cần thiết để làm việc trên dữ liệu). Đối với các hệ thống này, các thuật toán tối ưu hóa bộ nhớ đã được phát minh trong đó các thuật toán không tối ưu hóa bộ nhớ sẽ thất bại hoặc chạy chậm hơn rất nhiều. Trong thực tế, các hệ thống nhúng không phải là mục tiêu duy nhất của các thuật toán hiệu quả bộ nhớ: ví dụ: có các thuật toán lãng quên bộ nhớ cache điều chỉnh quá trình xử lý của chúng để sử dụng hiệu quả bộ đệm CPU. Một ví dụ khác: một số thuật toán học máy cho dữ liệu lớn được thiết kế chohọc tập gia tăng hoặc tính toán ngoài lõi để xử lý lượng dữ liệu khổng lồ lớn hơn nhiều so với bộ nhớ có sẵn trên bất kỳ máy tính nào, v.v.

Ngoài ra còn có các thuật toán không tối ưu hóa một phần cụ thể của máy tính, nhưng một tiêu chuẩn phụ thuộc vào kiến ​​trúc phần cứng. Ví dụ, dữ liệu số cần độ chính xác được lưu trữ bên trong float hoặc double, về bản chất bị giới hạn do giới hạn phần cứng. Vấn đề là các tính toán phức tạp có thể dẫn đến làm tròn và bạn càng thực hiện nhiều phép tính hơn các số được làm tròn, bạn sẽ càng trôi đi. Điều này được gọi là một sự can thiệp thảm khốc . Một số ứng dụng cần độ chính xác quan trọng, thậm chí với chi phí phức tạp nhất. Đối với loại ứng dụng này, các thuật toán tối ưu hóa tính toán của chúng để giảm hoặc loại bỏ nhiễu nghiêm trọng đã được thực hiện.

Do đó, thiết kế một thuật toán cũng có thể là sự đánh đổi giữa sự trừu tượng và các ràng buộc.

Cuối cùng, chúng ta có thể nói rằng một thuật toán cũng trừu tượng như mục tiêu của nó và như là điều kiện tiên quyết (kiến trúc) của nó . Mục tiêu cụ thể hơn mà thuật toán của bạn nhắm đến, nó có thể sẽ càng dựa vào kiến ​​trúc phần cứng.

Một số từ khóa liên quan có thể bạn quan tâm:


1
Tại sao hầu hết các thuật toán quan tâm liệu chúng đang chạy trên kiến ​​trúc Von Neumann hay Harvard? Hầu hết các hệ thống nhúng là sau, nhưng không gặp khó khăn khi chạy hầu hết các thuật toán. Ngoài ra, liên kết đến "kiến trúc lãng quên bộ nhớ cache" được đánh giá cao vì tôi chưa từng nghe thuật ngữ này trước đây, nhưng tôi không nghĩ câu đó là chính xác. Theo những gì tôi hiểu, các thuật toán lãng quên bộ đệm không điều chỉnh các mẫu truy cập của chúng cho phù hợp với bộ đệm - ngược lại, chúng sử dụng các mẫu truy cập sẽ hoạt động tốt trên hầu hết mọi bộ đệm để chúng không phải quan tâm đến cách bộ đệm công trinh.
14/2/2015

Có lẽ sẽ tốt khi quan sát rằng một số thuật toán truy cập một lượng lớn dữ liệu về cơ bản là ngẫu nhiên và sẽ hoạt động kém trên hầu hết mọi bộ đệm, một số sử dụng các mẫu cục bộ sẽ hoạt động tốt trên hầu hết mọi bộ đệm và một số có thể được điều chỉnh để hoạt động tốt với kiến trúc bộ đệm cụ thể nhưng sẽ hoạt động kém nếu được sử dụng với người khác.
14/2/2015

2

Bạn không nên nhầm lẫn một thuật toán nói chung với các thuật toán toán học hoặc điện toán. Nếu bạn có nghĩa là các thuật toán điện toán, vâng, chúng độc lập với kiến ​​trúc máy.

Định nghĩa thuật toán từ Wikipedia:

Trong toán học và khoa học máy tính , một thuật toán là một tập hợp các bước hoạt động độc lập sẽ được thực hiện. Các thuật toán tồn tại thực hiện tính toán , xử lý dữ liệu và suy luận tự động.

Định nghĩa này được sử dụng để chỉ một số nhiệm vụ tính toán hoặc xử lý dữ liệu đóng. Nói cách khác, các tính toán có thể được chạy một cách trừu tượng trên Turing Machine . Tuy nhiên, gần đây có một khái niệm trong toán học có tên Tính toán tương tác liên quan đến giao tiếp đầu vào / đầu ra với thế giới bên ngoài trong quá trình tính toán.

Trong một định nghĩa chung, thuật toán chỉ là một công thức (chuỗi các hướng dẫn). Tôi nghĩ rằng bạn không thể nghĩ ra một thuật toán mà không biết tập lệnh hoặc các thao tác mà bạn có thể sử dụng; Các phép toán là về tính toán, sau đó một thuật toán bao gồm một bước có tên là ' làm nóng lò ' không phải là một thuật toán toán học nhưng bạn có thể đưa nó cho một đầu bếp, bởi vì anh ta biết cách thực hiện nó.

Sau đó, bạn có thể tạo một máy có thể thực hiện X, Y, Z .... mỗi máy có thể được sử dụng trong thuật toán của bạn như một hướng dẫn. Nhưng nếu tất cả đều là về tính toán khép kín (trên thực tế, tính toán bước nhỏ kỹ thuật số xác định không tương tác), thì người ta có thể chứng minh rằng máy của bạn tương đương với Turing Machine . Nhưng nếu bạn nhắm mục tiêu loại tính toán khác (tiếp tục giá trị hoặc tính toán tương tác [tuy nhiên tôi không chắc chúng có thực sự là một loại tính toán khác]) hoặc thậm chí không có tác vụ tính toán nào, bạn có thể nghĩ về các máy có thể thực hiện chúng.

Câu hỏi và câu trả lời này cũng rất thú vị để có được góc nhìn rộng hơn về các thuật toán.


1

Nói chung, các thuật toán được thiết kế cho một số vấn đề cụ thể đồng thời giảm thiểu một số biện pháp "chi phí". Trong lịch sử, nhiều thuật toán được thiết kế dựa trên giả định rằng chi phí tương đối của các hoạt động chung sẽ tương đối giống nhau trên nhiều kiến ​​trúc, và do đó một số máy điển hình sẽ chạy một thuật toán sẽ chạy tốt hơn thuật toán khác, sau đó trên hầu hết các máy điển hình, thuật toán trước đây sẽ tệ nhất, chỉ kém hơn một chút so với sau này. Khi thời gian trôi qua, một giả định như vậy không còn đúng như trước đây.

Ví dụ, trước đây, số lần chương trình cần đọc mọi thứ từ bộ nhớ được coi là quan trọng hơn so với vị trí của những thứ cần đọc. Đọc những thứ nằm gần nhau trong bộ nhớ có phần rẻ hơn so với đọc những thứ ở xa nhau, nhưng không thể hiện quá mức. Vì tốc độ CPU chính đã tăng với tốc độ vượt xa tốc độ bộ nhớ, tuy nhiên, tầm quan trọng của chuỗi truy cập đã tăng đáng kể. Có thể có một chương trình thực hiện nhiều lệnh gấp mười lần so với một chương trình khác mà vẫn chạy nhanh hơn, nếu 95% bộ nhớ của chương trình cũ tạo ra các lần truy cập bộ đệm L1 và phần lớn bộ nhớ của chương trình sau đó sẽ tạo ra lỗi bộ nhớ cache.

Ngoài ra, một số loại thuật toán liên quan đến đồng thời đưa ra các giả định khác nhau về thời điểm dữ liệu được ghi vào bộ nhớ bởi một lõi bộ xử lý sẽ được "nhìn thấy" bởi các lõi khác. Nhiều bộ xử lý có nhiều cách khác nhau để chúng có thể đọc và ghi bộ nhớ, với chi phí khác nhau và đảm bảo về khả năng hiển thị. Một số thuật toán sẽ hoạt động rất tốt trên các kiến ​​trúc có thể đáp ứng các yêu cầu về khả năng hiển thị "miễn phí", nhưng kém hơn đối với các thuật toán khác, nơi các hướng dẫn cần thiết cho các đảm bảo đó rất tốn kém. Thật vậy, trên một số kiến ​​trúc, một số thuật toán liên quan đến đồng thời chỉ có thể được đảm bảo để hoạt động bằng cách giới hạn thực thi trong một lõi CPU được chia sẻ thời gian duy nhất (tất nhiên sẽ đánh bại điểm sử dụng thuật toán đồng thời).


1

Rất nhiều câu trả lời đang thiếu thực tế là một thuật toán có thể được định nghĩa theo các thuật ngữ trừu tượng từ hoặc theo quan hệ trực tiếp, theo nghĩa đen với một kiến ​​trúc. Một thuật toán phải rõ ràng, nhưng vẫn còn chỗ cho nó ít nhiều cụ thể.

Một thuật toán để chuyển đổi một chuỗi thành tất cả các mũ có thể được mô tả dễ dàng bằng mã giả độc lập với kiến ​​trúc. Nhưng đồng thời, không có gì ngăn cản bạn mô tả một thuật toán để chuyển đổi một chuỗi thành tất cả các mũ cụ thể trên kiến ​​trúc x86. Tất cả chỉ cần một bài tập về nhà hội x86. (Bạn vẫn có thể thực hiện điều này trong mã giả - chỉ là mã giả liên quan đến kiến ​​trúc đó!) Thực tế là vấn đề đặc biệt khi thực hiện điều này trên kiến ​​trúc x86 không có nghĩa là bạn không còn có thuật toán để giải quyết nó.

Nó phụ thuộc vào vấn đề thuật toán được xác định để giải quyết. Thuật toán độc lập với kiến ​​trúc nếu vấn đề mà nó giải quyết là độc lập với kiến ​​trúc (và giả sử rằng điều này không hoàn tác theo cách thuật toán được mô tả hoặc đặt lại với nhau). Vấn đề có thể là một lý thuyết, bảng đen, hoặc nó có thể là về mặt kiến ​​trúc rất cụ thể. Trong trường hợp sau, thuật toán lần lượt sẽ bị giới hạn làm việc với kiến ​​trúc đó.


1

Các thuật toán là một chuỗi các bước. Họ không phụ thuộc vào những gì (hoặc không) thực thi chúng.

Tuy nhiên, độ phức tạp thời gian của một thuật toán có thể phụ thuộc vào những gì đang thực hiện nó. Đó là lý do tại sao phân tích chi tiết thuật toán yêu cầu "mô hình tính toán", chẳng hạn như máy truy cập ngẫu nhiên .
Việc bộ nhớ có thể truy cập ngẫu nhiên hay không chắc chắn ảnh hưởng đến thời gian chạy thuật toán của bạn và hầu hết các thuật toán đều cho rằng đây là trường hợp trong khi thực tế hầu hết các kiến ​​trúc không thỏa mãn điều kiện này.


0

Họ khác nhau về bối cảnh khác nhau của các vấn đề. Thuật toán là tập hợp các bước để giải quyết vấn đề. Bối cảnh của vấn đề này có thể là về mặt lý thuyết bất cứ điều gì. Do đó thuật toán giải quyết vấn đề có thể phụ thuộc vào bất cứ thứ gì trên vũ trụ mà chúng ta có thể tưởng tượng. Hãy để tôi làm rõ với một ví dụ. Giả sử bạn được giao một nhiệm vụ,

Xây dựng một thuật toán sẽ phân phối tải cho nhiều lõi khi đa lõi có sẵn.

Bây giờ bạn có thể tưởng tượng thuật toán của bạn sẽ phụ thuộc vào kiến ​​trúc hay không? Tất nhiên là .

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.