2014-11-13 17 views
7

Context

đọc giấy tờ về tối ưu hóa bộ nhớ cache (gắn với một dòng bộ nhớ cache trong vòng ..)C - dòng bộ nhớ cache và hiệp hội

Câu hỏi đặt ra có liên quan đến bối cảnh này: mảng 1024 số nguyên.

Kích thước: bộ nhớ cache cpu 64k, dòng bộ nhớ cache 32byte, kích thước nguyên: 4 byte.

intel core 2 duo

Câu hỏi

Theo cpu của tôi, 8 số nguyên phù hợp trong một dòng bộ nhớ cache.

[0,1,2,3,4,5,6,7,8,9,10,...,1023] 
     ^
If I want to access 4 and go downward, 3,2,1 and 0 will be loaded already. 5,6,7 are loaded uselessly. 

[0,1,2,3,4,5,6,7,8,..,1023] 
      ^
If I want to access 7 and go downward, all the next elements will be in cache already. if I want to go upward, according to my cpu I will have to load another cache line immediatly after the arr[7] read. 

Tôi có chính xác không?

Đi thêm

Nhưng những gì nói với tôi rằng arr [4] không phải là ở một địa chỉ đó sẽ gây ra một dòng tải bộ nhớ cache thay vì arr [7]? Nếu tuyên bố của tôi là đúng, chúng tôi không chỉ nên xem xét sự sắp xếp trong mảng, nhưng sự liên kết toàn bộ bộ nhớ của chương trình để giảm thiểu chất thải bộ nhớ cache, phải không?

Trả lời

2

Theo như câu hỏi chính của bạn là có liên quan, có, bạn là chính xác trong cả hai trường hợp. Trong trường hợp thứ hai, trong đó arr[7] được tải và có thể muốn tiếp tục trở lên, bạn nên nhớ rằng có lẽ trình biên dịch hoặc một số cơ chế tìm nạp trước sẽ tính đến loại dữ liệu này, do đó cải thiện hiệu suất.

Đi xa hơn, thực sự đọc một số địa chỉ khác trong mảng có thể khiến tải dòng bộ nhớ cache thay vì arr[7] nếu mảng không được căn chỉnh đúng cách trong bộ nhớ, nhưng trong trường hợp này không tùy thuộc vào bạn, nhưng tối đa trình biên dịch.

3

Nhưng điều gì cho tôi biết rằng arr [4] không phải là địa chỉ sẽ khiến tải dòng bộ nhớ cache thay vì arr [7]?

mảng int thường được căn chỉnh trên đường viền 4 byte (giả sử int là 32 bit và byte 8 bit), vì vậy bạn sẽ không biết vị trí của đường biên giới bộ nhớ cache. Bài học cần tìm hiểu là bạn không nên lo lắng về dòng được lưu trữ không thường xuyên bị lãng phí (có nghĩa là sử dụng 2 dòng bộ nhớ cache mặc dù dữ liệu bạn cần ít hơn 32 byte), bởi vì phần lớn nó nằm ngoài tầm tay bạn khi mã hóa trong C.

Điều bạn có thể lo lắng, nếu bạn gặp sự cố về hiệu suất, hãy chọn các thuật toán làm giảm số lần nhớ cache.

Ví dụ điển hình là vòng:

int array[N][M]; // Assume N * M * sizeof (int) is much larger than the cache. 

// Example 1 
for (i=0; i<N; i++) { 
    for (j=0; j<M; j++) { 
    <do something with array[i][j]> 
    } 
} 

// Example 2 
int array[N][M]; 
for (j=0; j<M; j++) { 
    for (i=0; i<N; i++) { 
    <do something with array[i][j]> 
    } 
} 

Một trong những ví dụ sẽ cho khoảng 8 lần so với bỏ lỡ bộ nhớ cache là khác vì nó truy cập các yếu tố theo thứ tự sai.

+0

Cảm ơn. 1 cho ra khỏi tầm kiểm soát – Larry

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