Tôi không biết cách tối ưu hóa hiệu suất bộ nhớ cache ở mức thực sự thấp, suy nghĩ về kích thước bộ nhớ cache hoặc kết hợp. Đó không phải là điều bạn có thể học qua đêm. Xem xét chương trình của tôi sẽ chạy trên nhiều hệ thống và kiến trúc khác nhau, tôi không nghĩ rằng nó sẽ có giá trị nó anyway. Nhưng vẫn còn, có lẽ một số bước tôi có thể làm để giảm bớt bộ nhớ cache nhớ nói chung.C++: Cải thiện hiệu suất bộ nhớ cache trong mảng 3D
Đây là một mô tả về vấn đề của tôi:
Tôi có một mảng 3d của số nguyên, đại diện cho các giá trị tại các điểm trong không gian, như [x] [y] [z]. Mỗi kích thước có cùng kích thước, vì vậy nó giống như một khối lập phương. Từ đó tôi cần tạo một mảng 3D khác, trong đó mỗi giá trị trong mảng mới này là một hàm của 7 tham số: giá trị tương ứng trong mảng 3d gốc, cộng với 6 chỉ số "chạm" nó trong không gian. Tôi không lo lắng về các cạnh và góc của khối lập phương bây giờ.
Dưới đây là những gì tôi có nghĩa là trong C++:
void process3DArray (int input[LENGTH][LENGTH][LENGTH],
int output[LENGTH][LENGTH][LENGTH])
{
for(int i = 1; i < LENGTH-1; i++)
for (int j = 1; j < LENGTH-1; j++)
for (int k = 1; k < LENGTH-1; k++)
//The for loops start at 1 and stop before LENGTH-1
//or other-wise I'll get out-of-bounds errors
//I'm not concerned with the edges and corners of the
//3d array "cube" at the moment.
{
int value = input[i][j][k];
//I am expecting crazy cache misses here:
int posX = input[i+1] [j] [k];
int negX = input[i-1] [j] [k];
int posY = input[i] [j+1] [k];
int negY = input[i] [j-1] [k];
int posZ = input[i] [j] [k+1];
int negZ = input[i] [j] [k-1];
output [i][j][k] =
process(value, posX, negX, posY, negY, posZ, negZ);
}
}
Tuy nhiên, nó có vẻ như nếu LENGTH là đủ lớn, tôi sẽ nhận được tấn cache nhớ khi tôi đang lấy các tham số cho process
. Có một cách thân thiện với bộ nhớ cache để làm điều này, hoặc một cách tốt hơn để đại diện cho dữ liệu của tôi khác với một mảng 3D?
Và nếu bạn có thời gian trả lời các câu hỏi bổ sung này, tôi có phải xem xét giá trị LENGTH không? Giống như nó khác nhau cho dù LENGTH là 20 vs 100 vs 10000. Ngoài ra, tôi sẽ phải làm cái gì khác nếu tôi sử dụng một cái gì đó khác hơn là số nguyên, giống như một cấu trúc 64-byte?
@ ildjarn:
Xin lỗi, tôi không nghĩ rằng mã mà tạo ra các mảng tôi đi qua vào process3DArray
quan trọng. Nhưng nếu có, tôi muốn biết tại sao.
int main() {
int data[LENGTH][LENGTH][LENGTH];
for(int i = 0; i < LENGTH; i++)
for (int j = 0; j < LENGTH; j++)
for (int k = 0; k < LENGTH; k++)
data[i][j][k] = rand() * (i + j + k);
int result[LENGTH][LENGTH][LENGTH];
process3DArray(data, result);
}
"Tấn" nghĩa là gì? Bạn mong đợi bao nhiêu? –
Tôi không biết thực sự. Tôi có lẽ sẽ nhận được một bộ nhớ cache bỏ lỡ cho posX, negX, posY, và negY, nhưng có thể không cho posZ và negZ, vì những người có địa phương tốt hơn. – newprogrammer
http://en.wikipedia.org/wiki/Loop_tiling – Anycorn