OK, xin lỗi về câu trả lời đầu tiên của tôi. Sau đó, tôi nhận ra các ý kiến tiếp theo của bạn bên dưới câu hỏi của bạn, vì vậy tôi nhận ra rằng bạn muốn tuôn ra HƯỚNG DẪN CÀI ĐẶT để khởi động chương trình (hoặc một phần của nó) ra khỏi bộ đệm, để khi bạn kiểm tra hiệu năng của nó, bạn cũng kiểm tra thời gian tải ban đầu của nó ra khỏi bộ nhớ chính vào bộ nhớ cache lệnh. Bạn cũng cần xóa bất kỳ dữ liệu nào mà mã của bạn sẽ sử dụng cho bộ nhớ chính, sao cho cả dữ liệu và mã đều là tải mới?
Trước khi bất cứ điều gì khác, tôi muốn đề cập đến chính bộ nhớ chính cũng là một hình thức bộ nhớ cache, với đĩa cứng của bạn (hoặc chương trình trên đĩa, hoặc không gian trao đổi trên đĩa). hướng dẫn có thể đến từ. Điều đó nói rằng, khi lần đầu tiên bạn chạy qua một thường trình lần đầu tiên, nếu nó chưa được nạp vào bộ nhớ chính từ đĩa nhờ vào gần mã khác đã thực thi, thì các hướng dẫn CPU của nó trước tiên sẽ được nạp từ đĩa. Điều đó có một thứ tự độ lớn hoặc dài hơn tải nó từ bộ nhớ chính vào bộ nhớ cache. Sau đó, khi nó được nạp vào bộ nhớ chính, phải mất một nơi nào đó dọc theo các dòng của một trật tự cường độ dài hơn để tải từ bộ nhớ chính vào bộ nhớ cache hơn cần để tải từ bộ nhớ cache vào trình tìm nạp lệnh của CPU. Vì vậy, nếu bạn muốn kiểm tra hiệu suất khởi động nguội của mã, bạn phải quyết định khởi động nguội nghĩa là gì .... kéo nó ra khỏi đĩa, hoặc kéo nó ra khỏi bộ nhớ chính. Tôi không biết bất kỳ lệnh nào để "tuôn ra" hướng dẫn/dữ liệu ra khỏi bộ nhớ chính để trao đổi không gian, do đó xả nó ra bộ nhớ chính là nhiều như bạn có thể làm (mà tôi biết), nhưng hãy nhớ kết quả kiểm tra của bạn có thể vẫn khác với lần chạy đầu tiên (khi nó có thể kéo nó ra khỏi ổ đĩa) cho các lần chạy tiếp theo, ngay cả khi bạn xóa bộ nhớ cache lệnh.
Bây giờ, làm thế nào một trong những đi về xả bộ nhớ cache hướng dẫn để đảm bảo rằng mã riêng của họ được flushed ra bộ nhớ chính?
Nếu tôi cần làm điều này (điều rất kỳ lạ để làm theo ý kiến của tôi), tôi có thể bắt đầu bằng cách tìm độ dài & vị trí gần đúng của các chức năng của tôi trong bộ nhớ. Vì tôi đang sử dụng Linux, tôi sẽ đưa ra lệnh "objdump -d {myprogram}> myprogram.dump.txt", sau đó tôi mở myprogram.dump.txt trong trình chỉnh sửa và tìm kiếm các hàm tôi muốn xóa ra, và tìm ra bao lâu họ bằng cách trừ địa chỉ kết thúc của họ tạo thành địa chỉ bắt đầu của họ bằng cách sử dụng một máy tính hex. Tôi viết ra các kích thước của mỗi cái. Sau đó, tôi sẽ thêm các lời gọi cacheflush() vào mã của tôi, cho nó địa chỉ của mỗi hàm mà tôi muốn xóa như 'addr' và độ dài mà tôi tìm thấy là 'nbytes' và ICACHE. Chỉ cần cho an toàn tôi có lẽ sẽ fudge một chút & thêm khoảng 10% kích thước, chỉ trong trường hợp tôi thực hiện một vài tinh chỉnh cho mã và quên điều chỉnh nbyte. Tôi muốn thực hiện một cuộc gọi đến cacheflush() như thế này cho mỗi chức năng tôi muốn tuôn ra. Sau đó, nếu tôi cần xóa dữ liệu, nếu nó sử dụng dữ liệu toàn cục/tĩnh, tôi cũng có thể xóa các dữ liệu đó (DCACHE), nhưng nếu đó là dữ liệu đống hoặc đống, thực sự không có gì thực tế mà tôi có thể làm ra khỏi bộ nhớ cache. Cố gắng làm như vậy sẽ là một bài tập trong bấp bênh, bởi vì nó sẽ tạo ra một điều kiện không bao giờ hoặc rất hiếm khi tồn tại trong thực thi bình thường. Giả sử bạn đang sử dụng Linux ...
#include <asm/cachectl.h>
int cacheflush(char *addr, int nbytes, int cache);
...where cache is one of:
ICACHE Flush the instruction cache.
DCACHE Write back to memory and invalidate the affected valid cache lines.
BCACHE Same as (ICACHE|DCACHE).
BTW, đây có phải là bài tập về nhà cho lớp học không?
Tại sao bạn * nhu * để tuôn ra bộ nhớ cache? –
nó là một yêu cầu cho dự án của tôi liên quan đến tính toán thời gian thực hiện cho logic của tôi, do đó tôi cần phải xóa bộ nhớ cache. –
Có thể trùng lặp của http://stackoverflow.com/questions/1756825/cpu-cache-flush – Tudor