Еще больше ускорить умножение больших матриц AVX? Избегать магазинов во внутреннем l oop? - PullRequest
2 голосов
/ 07 августа 2020

Я хочу ускорить умножение матриц в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...