Я изучаю GEMM и попытался использовать блок кэша для оптимизации производительности. В основном я реализовал один и тот же код на C и Python. Почему производительность не улучшена на Python? (Только вычисление времени до и после l oop). Имеет ли python другой механизм чтения и хранения в кэше?
C код
int n = 512; // matrix size = 512*512
// basic matrix multiplication
void matrix(double **a, double **b, double **c){
int i, j, k;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
for (k=0; k<n; k++)
c[i][j] += a[i][k] * b[k][j];
}
// cache blocking for matrix multiplication
void matrixV1(double **a, double **b, double **c, int block){
int i, j, k, ii, jj, kk;
for (ii = 0; ii < n; ii += block)
for (jj = 0; jj < n; jj += block)
for (kk = 0; kk < n; kk += block)
for (i = ii; i < ii+block; i += 1)
for (j = jj; j < jj+block; j += 1)
for (k = kk; k < kk+block; k += 1)
c[i][j] += a[i][k] * b[k][j];
}
Python код
## basic matrix multiplication
def matrix(A,B):
## m=r=n=512 if matrix size = 512*512
m, r, n = len(A), len(A[0]), len(B[0])
C = [[0 for _ in range(n)] for _ in range(m)]
for i in range(m):
for j in range(n):
for k in range(r):
C[i][j] += A[i][k] * B[k][j]
return C
## cache blocking for matrix multiplication
def matrixV1(A, B, BLOCK=8):
## m=r=n=512 if matrix size = 512*512
m, r, n = len(A), len(A[0]), len(B[0])
C = [[0 for _ in range(n)] for _ in range(m)]
for ii in range(0, m, BLOCK):
for jj in range(0, n, BLOCK):
for kk in range(0, r, BLOCK):
for i in range(ii, ii+BLOCK, 1):
for j in range(jj, jj+BLOCK, 1):
for k in range(kk, kk+BLOCK, 1):
C[i][j] += A[i][k] * B[k][j]
return C