2013-02-20 48 views
7

Là câu hỏi chung cho những người làm việc về tối ưu hóa và điều chỉnh hiệu suất của các chương trình, làm cách nào để tìm hiểu xem mã của bạn có bị ràng buộc CPU hay bộ nhớ bị ràng buộc? Tôi hiểu những khái niệm này nói chung, nhưng nếu tôi đã nói, 'y' số lượng tải và lưu trữ và tính toán '2y', làm thế nào để tìm hiểu về nút cổ chai là gì? Ngoài ra, bạn có thể tìm ra chính xác nơi bạn dành phần lớn thời gian của mình và nói, nếu bạn tải lượng dữ liệu vào bộ đệm (nếu bộ nhớ bị ràng buộc), trong mỗi lần lặp lại, thì mã của bạn sẽ chạy nhanh hơn. ? Có cách nào chính xác để xác định điều này 'x', khác hơn là thử và sai?Hiểu xem mẫu mã có bị ràng buộc CPU hay bị ràng buộc bởi bộ nhớ

Có bất kỳ công cụ nào bạn sẽ sử dụng, nói trên kiến ​​trúc IA-32 hoặc IA-64 không? Doest VTune giúp đỡ?

Ví dụ, tôi đang làm như sau:

Tôi có 26 8 * 8 ma trận của đôi phức tạp và tôi phải thực hiện một MVM (ma trận vector nhân) với (~ 4000) vectơ có độ dài 8 , cho mỗi trong số 26 ma trận này. Tôi sử dụng SSE để thực hiện phép nhân phức tạp.

/*Copy 26 matrices to temporary storage*/ 
for(int i=0;i<4000;i+=2){//Loop over the 4000 vectors 
    for(int k=0;k<26;k++){//Loop over the 26 matrices 
     /* 
     Perform MVM in blocks of '2' between kth matrix and 
     'i' and 'i+1' vector 
     */  

    } 
} 

26 ma trận mất 26kb (L1 cache là 32KB) và tôi đã đặt các vectơ trong bộ nhớ như tôi đã truy cập stride'1 '. Khi tôi thực hiện MVM trên một vectơ với 27 ma trận, tôi không ghé thăm chúng một lần nữa, vì vậy tôi không nghĩ rằng việc chặn bộ nhớ cache sẽ giúp ích. Tôi đã sử dụng vector nhưng tôi vẫn bị mắc kẹt trên 60% hiệu suất cao điểm.

Tôi đã thử sao chép, nói 64 vectơ, vào bộ nhớ tạm thời, cho mỗi lần lặp của vòng lặp ngoài nghĩ rằng chúng sẽ nằm trong bộ nhớ cache và trợ giúp, nhưng hiệu suất chỉ giảm của nó. Tôi đã thử sử dụng _mm_prefetch() theo cách sau: Khi tôi hoàn thành một nửa ma trận, tôi tải vectơ 'i' và 'i + 1' tiếp theo vào bộ nhớ, nhưng điều đó cũng không giúp được gì.

Tôi đã làm tất cả điều này giả định bộ nhớ của nó bị ràng buộc nhưng tôi muốn biết chắc chắn. Là có một cách?

+0

bạn đang sử dụng hệ điều hành nào? – amdn

+0

Linux. Nhưng vấn đề hệ điều hành trong trường hợp này như thế nào? Tôi đang chạy nó trên một cụm bằng cách sử dụng lập kế hoạch công việc, do đó, không có quy trình nào khác đang chạy .. – user1715122

+0

Tôi tò mò, bạn đã thử sử dụng 'perf' chưa? – amdn

Trả lời

1

Để hiểu biết của tôi, cách tốt nhất là định cấu hình ứng dụng/khối lượng công việc của bạn. Dựa trên dữ liệu đầu vào, đặc tính của ứng dụng/khối lượng công việc có thể khác nhau đáng kể. Tuy nhiên, những hành vi này có thể được định lượng với một số ít phases Ref [2, 3] và biểu đồ có thể cho biết đường dẫn khối lượng công việc thường xuyên nhất được tối ưu hóa. Câu hỏi mà bạn đang yêu cầu cũng sẽ yêu cầu các chương trình điểm chuẩn [như SPEC2006, PARSEC, Media bench etc] cho kiến ​​trúc và khó trả lời theo thuật ngữ chung (và là một phần hoạt động nghiên cứu trong kiến ​​trúc máy tính). Tuy nhiên, đối với các trường hợp cụ thể, kết quả định lượng có thể được nêu cho các hệ thống phân cấp bộ nhớ khác nhau. Bạn có thể sử dụng các công cụ như:

  • Perf
  • oprofile
  • VTune
  • LikWid
  • LLTng

và các công cụ giám sát và mô phỏng khác để có được những dấu vết profiling của ứng dụng. Bạn có thể xem các bộ đếm hiệu năng như IPC, CPI (cho CPU bị ràng buộc) và truy cập bộ nhớ, nhớ cache, truy cập bộ nhớ cache và các bộ nhớ khác để xác định bộ nhớ boundedness.like IPC, truy cập bộ nhớ trên mỗi chu kỳ (MPC), thường được sử dụng để xác định bộ nhớ boundedness của một ứng dụng/khối lượng công việc. Để cải thiện đặc biệt phép nhân ma trận, tôi khuyên bạn nên sử dụng thuật toán tối ưu hóa như trong LAPACK.

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