#include <iostream>
#include <ctime>
#define N 1024
using namespace std;
int A[N][N];
int B[N][N];
int C2[N][N];
int C3[N][N];
int C1[N][N];
void Random(int(*a)[N], int n, int l, int r)//生成范围在l~r的随机数
{
srand(time(0)); //设置时间种子
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
a[i][j] = rand() % (r - l + 1) + l;//生成区间r~l的随机数
}
}
}
int main()
{
Random(A, N, 0, 10);
Random(B, N, 0, 10);
clock_t start, end;
// cache不友好方式
start = clock();
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
int c = 0;
for (int k = 0; k < N; ++k) {
c += A[i][k] * B[k][j];
}
C1[i][j] = c;
}
}
end = clock();
cout << "不友好方式" << (double)((double)end - start) / CLOCKS_PER_SEC << endl;
// cache 友好
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
C2[i][j] = 0;
}
}
start = clock();
for (int i = 0; i < N; ++i) {
for (int k = 0; k < N; ++k) {
for (int j = 0; j < N; ++j) {
C2[i][j] += A[i][k] * B[k][j];
}
}
}
end = clock();
cout << "友好方式1" << (double)((double)end - start) / CLOCKS_PER_SEC << endl;
// cache 友好
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
C3[i][j] = 0;
}
}
start = clock();
for (int k = 0; k < N; ++k) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
C3[i][j] += A[i][k] * B[k][j];
}
}
}
end = clock();
cout << "不友好方式2" << (double)((double)end - start) / CLOCKS_PER_SEC << endl;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if ((C1[i][j] != C2[i][j])|| (C1[i][j] != C3[i][j])) {
cout << "calculate error!!!" << endl;
cout << "(" << i << ", " << j << ") " <<
"C1: " << C1[i][j] <<
" <-> C2: " << C2[i][j] << endl;
return 0;
}
}
}
cout << "success!!!" << endl;
}
05-13
2924

11-16
748

08-07
547
