2008-11-07 23 views
7

Tôi đang tìm những thứ như sắp xếp lại mã mà thậm chí có thể phá vỡ mã trong trường hợp của một bộ xử lý đa.Một số thủ thuật mà một bộ xử lý thực hiện để tối ưu hóa mã là gì?

+0

Ông có thể vui lòng cập nhật để cụm từ này dưới dạng một câu hỏi? –

+0

Bạn có nghĩa là trình biên dịch? Bởi vì bạn sẽ nhận được các câu trả lời rất khác nhau ... –

+0

Trình duyệt nào? Nền tảng nào? –

Trả lời

0

Wikipedia có một danh sách khá toàn diện các kỹ thuật tối ưu hóa here.

+3

+0: Câu trả lời này giải thích cách trình biên dịch mã hóa, chứ không phải cách bộ xử lý làm như vậy. –

0

Có, nhưng câu hỏi của bạn chính xác là gì?

Tuy nhiên, vì đây là một chủ đề thú vị: các thủ thuật mà trình biên dịch và bộ vi xử lý sử dụng để tối ưu hóa mã không được ngắt mã, ngay cả với nhiều bộ xử lý, trong trường hợp không có điều kiện chủng tộc trong mã đó. Điều này được gọi là bảo đảm tính nhất quán tuần tự: nếu chương trình của bạn không có bất kỳ điều kiện chủng tộc nào và tất cả dữ liệu được khóa chính xác trước khi truy cập, mã sẽ hoạt động như được thực hiện tuần tự.

Có một video thực sự tốt của Herb Sutter nói chuyện về vấn đề này ở đây:

http://video.google.com/videoplay?docid=-4714369049736584770

Mọi người nên xem này :)

13

Điều quan trọng nhất là truy cập bộ nhớ sắp xếp lại.

Hàng rào bộ nhớ vắng mặt hoặc hướng dẫn tuần tự hóa, bộ xử lý được tự do sắp xếp lại quyền truy cập bộ nhớ. Một số kiến ​​trúc bộ vi xử lý có các hạn chế về số lượng chúng có thể sắp xếp lại; Alpha được biết đến là người yếu nhất (tức là, người có thể sắp xếp lại nhiều nhất).

Việc xử lý rất tốt đối tượng có thể được tìm thấy trong tài liệu nguồn nhân Linux, tại Documentation/memory-barriers.txt.

Hầu hết thời gian, tốt nhất là sử dụng các khóa nguyên thủy từ trình biên dịch hoặc thư viện chuẩn của bạn; đây là những thử nghiệm tốt, nên có tất cả các rào cản bộ nhớ cần thiết tại chỗ, và có lẽ khá tối ưu (tối ưu hóa khóa nguyên thủy là khó khăn; ngay cả các chuyên gia đôi khi có thể làm cho chúng sai).

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/286629/what-is-mean-by-memory-fences – CesarB

0

Câu trả lời của DavidK là chính xác, tuy nhiên cũng rất quan trọng để biết về mô hình bộ nhớ cho ngôn ngữ/thời gian chạy của bạn. Ngay cả khi không có điều kiện chủng tộc và với tính nhất quán tuần tự và việc sử dụng mutex, mã của bạn vẫn có thể bị ngắt khi dữ liệu đang được lưu trong bộ nhớ cache bởi các luồng khác nhau chạy trong các lõi khác nhau của CPU. Một số ngôn ngữ, Java là một ví dụ, đảm bảo trạng thái dữ liệu giữa các luồng khi một khóa mutex được sử dụng, nhưng hiếm khi đủ để đơn giản đảm bảo rằng không có hai luồng nào có thể truy cập dữ liệu cùng một lúc. Bạn cần sử dụng mutex theo đúng cách để đảm bảo rằng thời gian chạy ngôn ngữ đồng bộ hóa trạng thái dữ liệu giữa hai luồng. Trong java này được thực hiện bằng cách có hai chủ đề đồng bộ hóa trên cùng một đối tượng.

Đây là trang tốt giải thích sự cố và cách xử lý vấn đề trong mô hình bộ nhớ javas.

http://gee.cs.oswego.edu/dl/cpj/jmm.html

Các vấn đề liên quan