【发布时间】:2011-10-12 02:43:58
【问题描述】:
我必须在表示为二维数组的矩阵中找到对角线差,函数原型是
int diagonal_diff(int x[512][512])
我必须使用二维数组,数据为 512x512。这是在 SPARC 机器上测试的:我当前的时间是 6 毫秒,但我需要低于 2 毫秒。
样本数据:
[3][4][5][9]
[2][8][9][4]
[6][9][7][3]
[5][8][8][2]
区别在于:
|4-2| + |5-6| + |9-5| + |9-9| + |4-8| + |3-8| = 2 + 1 + 4 + 0 + 4 + 5 = 16
为了做到这一点,我使用以下算法:
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;
但是这种算法一直在访问列、行、列、行等,这使得缓存的使用效率很低。
有没有办法改善我的功能?
【问题讨论】:
-
您对此进行了基准测试或分析吗?真实矩阵有多大?任何 4 x 4 矩阵都可以放入缓存中,并且与您访问项目的顺序无关。
-
即使每秒执行 50,000,000 次,即使是低端的现代 CPU 也不会出汗。即使是对
abs()的函数调用也会被大多数编译器(包括 GCC 和 VC++)优化为固有的。 -
数组的大小是 512x512,我必须使用 2D 数组。接口规范是固定的,我只需要填写implementations.int对角差异(int x[512][512], int y[512][512])
-
该功能在 SPARC 上测试,我当前的时间是 6ms,我需要在 2ms 以下
-
是积极的编译器优化——例如“-O6”——正在使用?
标签: c optimization matrix