Разделение матрицы блоков GEMM не работает на python - PullRequest
0 голосов
/ 02 марта 2020

Я изучаю 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
...