| 7 | int x[n][n],y[n][n],z[n][n]; |
| 8 | int a,b,i,j,k,r; |
| 9 | void matrixmulti(int N, int x[n][n], int y[n][n], int z[n][n]){ |
| 10 | for (k = 0; k < N; k++) { |
| 11 | for (i = 0; i < N; i++) { |
| 12 | r = y[i][k]; |
| 13 | for (j = 0; j < N-4; j+=4) {//内层循环展开四次 |
| 14 | x[i][j] += r* z[k][j]; |
| 15 | x[i][j+1] += r* z[k][j+1]; |
| 16 | x[i][j+2] += r* z[k][j+2]; |
| 17 | x[i][j+3] += r* z[k][j+3]; |
| 18 | } |
| 19 | for(;j<N;j++) |
| 20 | x[i][j] += r* z[k][j]; |
| 21 | } |
| 22 | } |
| 23 | int main(){ |
| 24 | for (i = 0; i < n; i++) |
| 25 | { |
| 26 | for (j = 0; j < n; j++) |
| 27 | { |
| 28 | y[i][j] = rand() % 10; |
| 29 | z[i][j] = rand() % 10; |
| 30 | x[i][j] = 0; |
| 31 | } |
| 32 | } |
| 33 | struct timeval starttime,endtime; |
| 34 | gettimeofday(&starttime,0); |
| 35 | matrixmulti(n, x, y, z); |
| 36 | gettimeofday(&endtime,0); |
| 37 | doubletimeuse=(endtime.tv_sec-starttime.tv_sec)+(endtime.tv_usec-starttime.tv_usec)/1000000.0; |
| 38 | printf("run time = %f s\n", timeuse); |
| 39 | return 0; |
| 40 | } |