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?
bạn đang sử dụng hệ điều hành nào? – amdn
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
Tôi tò mò, bạn đã thử sử dụng 'perf' chưa? – amdn