Делает ли память деление между потоками медленнее? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь реализовать наивное многопоточное матричное умножение, я создаю несколько потоков для каждой линейной комбинации, используя вручную распределенный массив результатов и записываю в соответствующую позицию в каждом потоке, однако мой код выполняется медленнее, чем в одиночноммногопоточная версия, это использование памяти, которая замедляет код?

Я использовал выделение кучи, чтобы избежать копирования памяти, но может ли это быть проблемой?

#define rows first
#define columns second 

void linear_combination(double const *arr_1,std::pair<int, int> sp_1,
                        double const *arr_2, std::pair<int, int> sp_2,
                        double *arr_3, std::pair<int, int> sp_3,
                        int base_row,int base_col){
    double sum = 0;
    for (int i = 0; i < sp_1.columns; i++){
        int idx_1 = base_row * sp_1.columns + i;
        int idx_2 = i * sp_2.columns + base_col;
        sum += arr_1[idx_1] * arr_2[idx_2];
    }
    int idx_3 = base_row * sp_3.columns + base_col;
    arr_3[idx_3] = sum;
}

auto matmul(double *m1, std::pair<int, int> sp_1, double *m2, std::pair<int, int> sp_2){
    // "sp_n" stands for shape for n-th matrix
    if (sp_1.second == sp_2.first){
        auto *m3 = (double *) malloc(sp_1.first*sp_2.second* sizeof(double));
        std::pair sp_3 = {sp_1.first, sp_2.second};

        for (int k = 0; k < sp_3.rows; k++){
            std::vector<std::thread> thread_list(sp_2.columns);
            for (int j = 0; j < sp_2.columns; j++){
                // will automatically save linear combination sum into m3

                thread_list[j] = ( std::thread(linear_combination,
                                               m1, sp_1,
                                               m2, sp_2,
                                               m3, sp_3,
                                               k, j) );
            }

            // join threads and use calculation
            std::for_each(thread_list.begin(), thread_list.end(), std::mem_fn(&std::thread::join));
        }

        return std::make_tuple(m3, sp_3);
    } else{
        puts("Size mismatch");
        printf("%d %d\n", sp_1.second, sp_2.first);
        double m3 = 0;
        return std::make_tuple(&m3, std::make_pair(0, 0));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...