Math Problem Statement

for (int k = 0; k < K; ++k) { for (int c = 0; c < C; ++c) { float *filters_ptr = filter + (k * C + c) * sizeF; sgemm(&G[0][0], filters_ptr, tmp_u, 4, 3, 3); sgemm(tmp_u, &G_T[0][0], u, 4, 3, 4); for (int xi = 0; xi < 4; ++xi) { int base_index = ((xi * 4) * K + k) * C + c; memcpy(&U[base_index], &u[xi * 4], 4 * sizeof(float)); } } }我们将U矩阵的存储方式改变,而后U矩阵的读取方式也要相应的改变最后V矩阵和U矩阵的计算结果要保持不变float tmp_v[16]; float d[16]; // d: [4 * 4]; float v[16]; // v: [4 * 4]; #pragma omp parallel for collapse(2) private(tmp_v, d, v) for (int n = 0; n < N; ++n) for (int c = 0; c < C; ++c) { for (int y = 0; y < outHeight / 2; ++y) { for (int x = 0; x < outWidth / 2; ++x) {

// Generate d_cb for (int iy = 0; iy < 4; ++iy) for (int ix = 0; ix < 4; ++ix) d[iy * 4 + ix] = image[(n * C + c) * sizeI + (y * 2 + iy) * inWidth + (x * 2 + ix)]; sgemm(&B_T[0][0], d, tmp_v, 4, 4, 4); sgemm(tmp_v, &B[0][0], v, 4, 4, 4); int b = ((n * outHeight / 2) + y) * outWidth / 2 + x; for (int xi = 0; xi < 4; ++xi) for (int nu = 0; nu < 4; ++nu) V[((long)(xi * 4 + nu) * C + c) * P + b] = v[xi * 4 + nu]; } } }

// M[xi, nu, :, :] = U[xi, nu, :, :] * V[xi, nu, :, :] for (int xi = 0; xi < 4; ++xi) { for (int nu = 0; nu < 4; ++nu) { float *M_ptr = M + (long)(xi * 4 + nu) * K * P; float *U_ptr = U + (long)(xi * 4 + nu) * K * C; float *V_ptr = V + (long)(xi * 4 + nu) * C * P; sgemm_parallel(U_ptr, V_ptr, M_ptr, K, C, P); } }

// Y = A_T * m * A float mm[16]; // 4 * 4 float tmp_m[8]; // 2 * 4 float temp_out[4]; // 2 * 2 for (int n = 0; n < N; ++n) for (int k = 0; k < K; ++k) { for (int y = 0; y < outHeight / 2; ++y) { for (int x = 0; x < outWidth / 2; ++x) { int b = (n * outHeight / 2 + y) * outWidth / 2 + x; for (long xi = 0; xi < 4; ++xi) { for (long nu = 0; nu < 4; ++nu) { mm[xi * 4 + nu] = M[((xi * 4 + nu) * K + k) * P + b]; } } sgemm(&A_T[0][0], mm, tmp_m, 2, 4, 4); sgemm(tmp_m, &A[0][0], temp_out, 2, 4, 2); for (int i = 0; i < 2; ++i) for (int j = 0; j < 2; ++j) out[(long)((n * K + k) * outHeight + y * 2 + i) * outWidth + x * 2 + j] = temp_out[i * 2 + j]; } } } }

Solution

Ask a new question for Free

By Image

Drop file here or Click Here to upload

Math Problem Analysis

Mathematical Concepts

Matrix Operations
SGEMM Functions
Parallel Processing

Formulas

Matrix multiplication

Theorems

-

Suitable Grade Level

Advanced Level