Tôi đang cố kiểm tra thuộc tính bộ đệm của máy mà tôi có quyền truy cập. Để làm điều này, tôi đang cố gắng đọc bộ nhớ và tính thời gian cho nó. Tôi đã thay đổi kích thước bộ làm việc và chế độ truy cập sải chân để có được các phép đo khác nhau.
Mã trông như thế này:
clock1 = get_ticks()
cho (i = 0; tôi < 1000000; i++) {
for (j = 0; j < (bộ công việc * sải chân / sizeof(data_t)); j += sải bước) {
*mảng[j];
}
}
clock2 = get_ticks()
Bây giờ câu hỏi là, ở mức tối ưu hóa hợp lý, gcc sẽ tối ưu hóa việc đọc vì nó không có tác dụng phụ. Tôi không thể có mức tối ưu hóa, nếu không tất cả các biến vòng lặp sẽ khiến bộ nhớ bị đọc. Tôi đã thử một số cách khác nhau, chẳng hạn như làm cho mảng có thể thay đổi và sử dụng hàm nội tuyến chuyển đổi thành có thể thay đổi, nhưng việc xử lý các biến có thể thay đổi của gcc rất khó dự đoán. Cách thích hợp để làm điều này là gì?
Một khả năng là sử dụng dữ liệu mảng theo cách không dễ dàng tối ưu hóa, ví dụ:
clock1 = get_ticks();
tổng = 0;
cho (i = 0; tôi < 1000000; i++) {
for (j = 0; j < (bộ công việc * sải chân / sizeof(data_t)); j += sải bước) {
tổng += mảng[j];
}
}
clock2 = get_ticks();
trả lại số tiền;
tổng hợp
Phải nằm trong một thanh ghi và thao tác bổ sung sẽ không có bất kỳ tác động nào đến thời gian vòng lặp.
Nếu hàm kiểm tra và hàm gọi đều nằm trong cùng một đơn vị biên dịch, bạn cũng có thể muốn đảm bảo rằng bạn thực sự làm điều gì đó với giá trị tổng được trả về, chẳng hạn như xuất ra qua printf.
Tôi là một lập trình viên xuất sắc, rất giỏi!