Tôi phải tìm ra sự khác biệt chéo trong một ma trận biểu diễn dưới dạng mảng 2ngày và nguyên mẫu chức năng làCải thiện hiệu suất hoạt động của C với vị trí bộ nhớ cache?
int diagonal_diff(int x[512][512])
tôi phải sử dụng một mảng 2d, và các dữ liệu là 512x512. Điều này được thử nghiệm trên một máy SPARC: thời gian hiện tại của tôi là 6ms nhưng tôi cần phải dưới 2ms.
dữ liệumẫu:
[3][4][5][9]
[2][8][9][4]
[6][9][7][3]
[5][8][8][2]
Sự khác biệt là:
|4-2| + |5-6| + |9-5| + |9-9| + |4-8| + |3-8| = 2 + 1 + 4 + 0 + 4 + 5 = 16
Để làm được điều đó, tôi sử dụng các thuật toán sau đây:
int i,j,result=0;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
result+=abs(array[i][j]-[j][i]);
return result;
Nhưng thuật toán này giúp truy cập cột, hàng, cột, hàng, v.v ... làm cho việc sử dụng bộ đệm không hiệu quả.
Có cách nào để cải thiện chức năng của tôi không?
Bạn có chuẩn hoặc hồ sơ này? Ma trận thực sự lớn đến mức nào? Bất kỳ ma trận 4 x 4 nào cũng phù hợp với bộ nhớ đệm và không liên quan đến thứ tự bạn truy cập vào các mục. –
Thậm chí nếu bạn thực hiện điều này 50.000.000 lần mỗi giây, thậm chí ngay cả một CPU hiện đại cấp thấp cũng sẽ không đổ mồ hôi. Ngay cả hàm gọi hàm 'abs()' sẽ được tối ưu hóa như bản chất của hầu hết các trình biên dịch (bao gồm GCC và VC++.) –
kích thước của mảng là 512x512 và tôi phải sử dụng một mảng 2D. thông số kỹ thuật giao diện được cố định, tôi chỉ phải điền vào implementations.int diagonal_diff (int x [512] [512], int y [512] [512]) –