Я хочу ускорить умножение матриц в C. Я попытался использовать несколько методов, таких как OpenMP, SIMD и удобство кеширования, чтобы оптимизировать его, и теперь скорость может достигать 65x.
Причина относительно низкого ускорения заключается в том, что я использую _mm256_storeu_pd()
в самый внутренний l oop, а запись в память стоит дорого.
Может ли кто-нибудь дать мне несколько идей, как избежать использования дорогостоящей записи в память во внутреннем l oop, чтобы я мог дополнительно оптимизировать код?
void mul_matrix(matrix *result, matrix *mat1, matrix *mat2){
int I = mat1->rows;
int J = mat2->cols;
int K = mat2->rows;
#pragma omp parallel for
for(int i = 0; i < I; i++){
for(int k = 0; k < K; k++){
_m256d vA = _mm256_set1_pd(mat1->data[i * K + k]);
for(int j = 0; j < J / 4 * 4; j += 4){
_m256d sum = _mm256_loadu_pd(result->data + i * J + j);
_m256d vB = _mm256_loadu_pd(mat2->data + k * J + j);
_m256d intermediate = _mm256_mul_pd(vA, vB);
sum = _mm256_add_pd(sum, intermediate);
_mm256_storeu_pd(result->data + i * J + j, sum);
}
for(int x = J / 4 * 4; x < J; x++){
result->data[i * J + x] += mat1 -> data[i * K + k] * mat2 -> data[k * J + x];
}
}
}
}
typedef struct matrix{
int rows;
int cols;
double* data;
}matrix;