2010-06-01 8 views
11

Tôi muốn biết nếu một chương trình mà tôi đang sử dụng và đòi hỏi nhiều bộ nhớ bị giới hạn bởi băng thông bộ nhớ.Khi nào một chương trình bị giới hạn bởi băng thông bộ nhớ?

Khi nào bạn mong đợi điều này xảy ra? Nó có bao giờ xảy ra với bạn trong một kịch bản thực tế không?

tôi thấy một số điều thảo luận về vấn đề này, bao gồm:

Các liên kết đầu tiên là một chút cũ, nhưng gợi ý rằng bạn cần phải thực hiện ít hơn khoảng 1-40 hoạt động điểm động trên mỗi biến số dấu chấm động để xem hiệu ứng này (đúng với tôi nếu tôi sai).

Làm cách nào để đo băng thông bộ nhớ mà một chương trình cụ thể đang sử dụng và làm cách nào để đo băng thông (cao điểm) mà hệ thống của tôi có thể cung cấp?

Tôi không muốn thảo luận về bất kỳ sự cố bộ nhớ cache phức tạp nào tại đây. Tôi chỉ quan tâm đến sự giao tiếp giữa CPU và bộ nhớ.

+2

Thật không may, bạn không thể tránh bị xâm nhập vào bộ nhớ cache phức tạp nếu bạn muốn câu trả lời cho câu hỏi của mình – erikkallen

+0

Hm, giả sử tôi khởi tạo toàn bộ bộ nhớ với 1.0s. Sau đó, tôi nhân mỗi phần tử với một số không đổi. Và lặp lại quá trình đó .. – hanno

+0

Truy cập tất cả bộ nhớ sẽ khiến bạn bị giới hạn bởi băng thông bộ nhớ, trừ khi khoảng cách giữa các phần tử được truy cập là rất dài. Mà, từ những gì nó giống như âm thanh, nó sẽ không được. –

Trả lời

7

Để kiểm tra hiệu suất bộ nhớ của hệ thống, hãy thử STREAM benchmark. Nghiên cứu các nhiệm vụ chuẩn và kết quả bạn nhận được một cách cẩn thận vì chúng cung cấp dữ liệu cơ bản về bộ nhớ của bạn mà bạn cần làm thêm bất cứ điều gì. Bạn cần phải tìm ra (các) hiệu ứng của bộ đệm (s) - bạn phải hiểu chúng - và khi băng thông đạt đến đỉnh.

Để tìm ra hiệu suất bộ nhớ của chương trình của bạn:

  1. Đo thời gian thực hiện cho một loạt các vấn đề kích cỡ.
  2. Tính toán, bằng tay, số lượng dữ liệu mà chương trình của bạn đọc và ghi từ và đến bộ nhớ cho cùng phạm vi kích thước sự cố.
  3. Chia bộ nhớ sử dụng theo thời gian.

CẢNH BÁO: đây là phương pháp thô và chỉ nên được sử dụng để tìm hiểu xem bạn có nên chú ý đến vấn đề băng thông bộ nhớ hay không. Nếu hình tượng thô của bạn cho bạn biết rằng chương trình của bạn sử dụng ít hơn 50% băng thông bộ nhớ có sẵn (các con số bạn nhận được từ điểm chuẩn STREAM) thì bạn không nên suy nghĩ thêm.

Cách tiếp cận thô này hoạt động tốt nhất khi chương trình của bạn thao tác tương đối ít cấu trúc dữ liệu rất lớn với các mẫu truy cập đơn giản. Điều này mô tả rất nhiều chương trình khoa học hiệu năng cao nhưng có lẽ không có nhiều loại chương trình khác.

Nếu chương trình của bạn đang sử dụng bộ nhớ ảo hoặc nếu nó đang làm I/O khi nó thực hiện, thì băng thông bộ nhớ không phải là vấn đề, không phải cho đến khi bạn sắp xếp băng thông đĩa.

Cuối cùng, có, mỗi khi tôi chạy một trong các mã khoa học của chúng tôi tốc độ thực thi bị giới hạn bởi băng thông bộ nhớ. Theo quy tắc chung, nếu mã thực thi 10% FLOPS thì đặc tả bộ vi xử lý hứa hẹn tôi sẽ hài lòng.

+0

Cảm ơn. Tôi sẽ cố gắng làm điều đó... – hanno

3

Phạm vi rộng và tổng quát của câu hỏi của bạn khiến bạn gần như không thể trả lời được nhiều hơn ý nghĩa rộng nhất.

Bạn có thể mong đợi một chương trình bị ràng buộc CPU khi số chu kỳ CPU cần để xử lý một dòng dữ liệu trong ít hơn số chu kỳ CPU cần thiết để đọc một dòng bộ nhớ cache và tập dữ liệu được xử lý lớn hơn đáng kể bộ đệm dữ liệu của CPU. Xử lý hình ảnh là một ví dụ mà đây thường là trường hợp.

Làm cách nào để đo băng thông bộ nhớ mà một chương trình cụ thể đang sử dụng và làm cách nào để đo băng thông (cao điểm) mà hệ thống của tôi có thể cung cấp? Chỉ có thể đo đầu tiên (trong phần mềm) nếu CPU hỗ trợ một số loại bộ đếm hiệu suất đếm số chu kỳ mà CPU bị ngừng bởi vì nó phải chờ truy cập bộ nhớ hoàn tất.
Cách thứ hai có thể dễ dàng đo được, thường là điền/sao chép các vùng nhớ lớn. Có vô số các chương trình chuẩn có sẵn mà bạn có thể sử dụng (tôi chưa từng sử dụng một trong số đó trong nhiều năm, nhưng SandraPCMark đến với tâm trí. Sẽ có rất nhiều tiện ích phần mềm miễn phí thực hiện điều này).

6

Memory ứng dụng chuyên sâu hoặc các ứng dụng đòi hỏi nhiều bộ nhớ được giới hạn bởi:

  1. Tốc độ của RAM bên ngoài bộ vi xử lý
  2. Tốc độ của bộ nhớ cache bên trong bộ vi xử lý
  3. Số đơn vị chia sẻ bộ nhớ xe buýt
  4. Bộ nhớ ảo

Thật không may, thes e hạn chế không phải là người chơi chính trong hoạt động của chương trình. Hiệu ứng lớn hơn là: Số lượng CPU, hoạt động I/O và các tác vụ khác đang chạy với chương trình của bạn. Thay đổi các mục này sẽ tác động đến chương trình của bạn hơn là thay đổi các mục ảnh hưởng đến băng thông bộ nhớ.

1. Tốc độ RAM bên ngoài bộ xử lý
Bộ xử lý phải nằm ngoài vỏ và lấy hướng dẫn và dữ liệu từ RAM. RAM có tốc độ khác nhau mà tại đó nó có thể truy cập vào các ô và trả về các bit trở lại bộ xử lý. Nói chung, điều này được đánh dấu bằng đơn vị Hz. Bộ nhớ càng nhanh, thời gian của bạn càng mất nhiều thời gian cho quá trình tải và hướng dẫn tải xuống và chương trình của bạn sẽ thực thi nhanh hơn.

Lưu ý: Tăng tốc độ bộ nhớ vượt quá khả năng của bộ xử lý sẽ không làm tăng hiệu suất. Nó thay đổi nút cổ chai từ RAM sang bộ vi xử lý. Xem thêm # 3.

2. Tốc độ bộ nhớ cache bên trong bộ xử lý Bộ nhớ cache nằm bên trong vỏ bộ xử lý. Đây là một trong những loại bộ nhớ nhanh nhất hiện có. Bộ vi xử lý sẽ tìm kiếm bộ nhớ này trước khi tìm kiếm RAM. Cải thiện tốc độ và số lượng của bộ nhớ này sẽ cải thiện hiệu suất của bộ xử lý của bạn, trừ khi các lõi khác cũng đang truy cập bộ nhớ này. Đối với nhiều lõi truy cập bộ nhớ, cần phải có giải pháp xung đột, điều này có thể làm chậm hiệu suất ứng dụng của bạn.

Lưu ý: Không có gì bạn có thể làm để tăng tốc hoặc thay đổi kích thước bộ nhớ cache ngoại trừ có bộ xử lý khác. Bộ nhớ cache không phải là thứ có thể dễ dàng thay đổi bằng bàn tay con người hoặc robot.

3. Số lượng thực thể chia sẻ bus bộ nhớ
Bus bộ nhớ giống như đường cao tốc mà thực thể dùng để truy cập RAM. Giống như với đường cao tốc, nhiều làn đường hơn có nghĩa là thông lượng nhanh hơn (ví dụ: chiều rộng 16 bit so với 32 bit). Nhiều xe buýt cũng có giới hạn tốc độ, một lần nữa giới hạn càng cao thì càng có thể truy cập nhanh hơn. Có lẽ khái niệm đáng chú ý nhất là số lượng thực thể kết nối với xe buýt. Như với đường cao tốc, nhiều người dùng hơn làm chậm lưu lượng truy cập. Trong hầu hết các bus bộ nhớ, chỉ một thực thể có thể sử dụng nó tại một thời điểm; các thực thể khác phải đợi. Giảm số lượng thực thể cần sử dụng bus bộ nhớ sẽ tăng tốc chương trình của bạn.

Một số thực thể phổ biến chia sẻ bus bộ nhớ: CPU, bộ điều khiển DMA, bộ xử lý video, bộ xử lý âm thanh và bộ xử lý mạng hoặc I/O.

4. Bộ nhớ ảo. Nhiều máy tính hiện đại sử dụng bộ nhớ ảo. Nếu chương trình yêu cầu nhiều bộ nhớ hơn RAM có sẵn, hệ điều hành sẽ trao đổi các phần bộ nhớ với các vùng trên ổ đĩa cứng. Điều này tốn nhiều thời gian hiệu suất hơn là giảm tốc độ hoạt động của bộ nhớ. Một chương trình chuyên sâu bộ nhớ hiệu quả hơn bằng cách chỉ sử dụng bộ nhớ được cấp phát cho nó hơn tất cả bộ nhớ mà nó có thể cần. Giảm các hoán đổi bộ nhớ ảo sẽ tăng tốc một chương trình.


Tóm lại, tốc độ tối đa mà ứng dụng của bạn có thể thực thi. Bộ nhớ, cả bộ đệm trong và bộ nhớ ngoài đều là các yếu tố góp phần vào giới hạn trên. Có những yếu tố lớn hơn ngăn các ứng dụng đạt đến giới hạn này. Một số yếu tố này là các hoạt động I/O và các nhiệm vụ đồng thời khác. Việc thiết kế và thực hiện một chương trình cũng có thể góp phần vào sự chậm chạp. Hiệu suất cao hơn có thể đạt được bằng cách loại bỏ các hoạt động I/O, các tác vụ đồng thời và thiết kế lại phần mềm bằng cách thay đổi giới hạn trên của tốc độ truy cập bộ nhớ. Thay đổi các giới hạn này sẽ làm tăng hiệu suất của chương trình, nhưng không mạnh bằng các kỹ thuật khác.

+1

Đó là một bản tóm tắt tốt đẹp, nhưng không thực sự trả lời câu hỏi của tôi: Làm thế nào tôi có thể đo băng thông bộ nhớ mà một chương trình cụ thể đang sử dụng? – hanno

+0

Bạn có thể đo băng thông bằng trình gỡ lỗi hoặc trình gỡ lỗi JTAG được kết nối với bộ xử lý. Nếu không nó trở nên khó khăn. Tôi khuyên bạn nên lược tả các phần mã có bộ nhớ chuyên sâu. Một ý tưởng khác là đặt một máy phân tích logic trên bus dữ liệu với một dòng trên chip chọn RAM. –

1

Các chương trình bị giới hạn bởi băng thông bộ nhớ có tham chiếu bộ nhớ cao hơn (hoạt động tải và/hoặc lưu trữ) cho phép tính số học/logic. Ví dụ là các quy trình BLAS1 như daxpy, ddot, v.v.

Nếu các quy trình hàng đầu mã (từ cấu hình phẳng) có nhiều phép tính số học để tải/lưu trữ, thì bạn không bị ảnh hưởng bởi băng thông bộ nhớ nhiều. Ví dụ được tối ưu hóa ma trận ma trận nhân, LINPACK.